自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

奶牛养殖场小马

正经人谁写博客啊

  • 博客(462)
  • 收藏
  • 关注

原创 16_网络IPC16-TCP与UDP的消息保护边界

根据以上所说,可以这样理解,TCP为了保证可靠传输,尽量减少额外开销(每次发包都要验证),因此采用了流式传输,面向流的传输,相对于面向消息的传输,可以减少发送包的数量。而UDP,由于面向的是消息传输,它把所有接收到的消息都挂接到缓冲区的接受队列中,因此,它对于数据的提取分离就更加方便,但是,它没有粘包机制,因此,当发送数据量较小的时候,就会发生数据包有效载荷较小的情况,也会增加多次发送的系统发送开销(系统调用,写硬件等)和接收开销。因此,应该最好设置一个比较合适的数据包的包长,来进行UDP数据的发送。

2024-07-26 16:46:28 409

原创 17_高级进程间通信 UNIX域套接字1

第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。不管是数据流还是数据报协议,unix域套接字都是可靠的,不丢包的。示例代码抄录自:https://blog.csdn.net/bytxl/article/details/47861469。第1个参数domain,表示协议族,只能为AF_LOCAL或者AF_UNIX;命名UNIX域套接字。

2024-07-21 17:14:39 425

原创 16_网络IPC15-Socket Select 构建高效网络通信模型

使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。在网络编程中,当涉及到多客户访问服务器的情况,我们首先想到的办法就是fork出多个进程来处理每个客户连接,或者使用多线程处理。现在,我们同样可以使用select来处理多客户问题,而不用fork或者多线程,只在单线程既可处理。以下代码例程照抄自:https://blog.csdn.net/weixin_41010318/article/details/80257177。

2024-07-21 12:38:29 178

原创 16_网络IPC5-套接字选项

2024-07-20 18:04:48 98

原创 16_网络IPC4-数据传输

Socket 只是通信节点,通信之前需要连接,即发送端发送之前 需要知道对端的地址,才能找到对端的socket节点,才能发送成功。而接收端不同,接收函数 如 recv () 不需要一定知道对端地址,因为接收端只需要监控本机的socket即可。Socket 只是通信节点,通信之前需要连接,即发送端发送之前 需要知道对端的地址,才能找到对端的socket节点,才能发送成功。而接收端不同,接收函数 如 recv () 不需要一定知道对端地址,因为接收端只需要监控本机的socket即可。

2024-07-20 17:59:58 210

原创 16_网络IPC3-建立连接

服务端使用 listen() 表明自己愿意接受连接,并标明最多连接客户端的数量,理解为服务端对系统声明,我已经准备好接受客户端的连接的,最多能接受多少客户端的连接。然后使用 accept() 开始等待客户端的连接。

2024-07-16 23:22:18 138

原创 16_网络IPC2-寻址

不同的协议族 来 绑定自己这端的地址 所用的结构体是不一样的。所以我们的处理方式是:我们用的是哪一个协议族,就把该协议族地址作为addr ,然后再把地址长度写到addrlen。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。AF_INET 协议族中的 协议地址类型为 struct sockaddr_in。

2024-07-16 23:18:19 200

原创 16_网络IPC1-套接字描述符

用户数据报协议(UDP) 与 传输控制协议(TCP)文件描述符函数使用套接字的行为。

2024-07-15 22:08:52 157

原创 15_进程间通信7-POSIX信号量

‌关闭操作只是简单地结束了调用进程与信号量之间的关联,‌而信号量本身在系统中仍然存在。‌这意味着,‌即使调用了 sem_close,‌信号量也不会立即从系统中被删除,‌只要还有其他进程仍然使用该信号量1。‌当调用 sem_unlink 时,‌如果系统中没有其他进程再使用该命名信号量,‌那么该信号量就会被彻底地从系统中移除2。简而言之,‌sem_close 只是断开了调用进程与信号量的关联,‌而 sem_unlink 则是从系统中彻底移除了信号量,‌确保了资源的有效利用和避免闲置的信号量组占用系统资源。

2024-07-11 15:48:00 310

原创 十四_高级IO6-记录锁 fcntl()

记录锁 flockptr 参数说明。多进程与单进程 对记录锁的使用区别。记录锁 cmd 参数说明。记录锁的 组合 和 分裂。

2024-07-09 14:36:04 222

原创 15_进程间通信3-命名管道FIFO

匿名管道:piepe(),磁盘上看不到文件,相当于直接给了我们一个文件描述符或者FILE*。导致最直接的结果就是 :如果两个进程之间没有血缘关系,是不能用匿名管道进行通信的,因为另一个进程找不到文件位置。命名管道:mkfifo(), 从磁盘上看到的文件类型为P 的文件。没有血缘关系的进程之间 可以用命名管道进行通信。本质上就是当前磁盘上存在的一个文件。XSI :消息队列,信号量数组,共享内存。指定我们所创建的命名管道的名字。内核提供,单工,自同步机制。管道必须要凑齐读写双方。

2024-06-19 21:51:37 204

原创 15_进程间通信2-popen

2024-06-19 21:50:08 130

原创 15_进程间通信2-popen

2024-06-17 22:40:01 326

原创 十_信号14 - system()

意思是 应在在调用 system() 函数前 阻塞 SIGCHLD 信号,否则,子进程结束的时候,系统会向该进程(父)发送 SIGCHLD信号,则该进程认为是自己的一个子进程结束了,于是调用 wait函数获取子进程的终止状态。这本来是正常的操作,但是在使用 system()时候,这样的操作 会影响到 system函数内部的 wait()操作,导致system()内部获取子进程的终止状态的 wait()函数获取错误的状态,并将此错误的返回状态return到调用者。

2024-06-02 19:11:14 234

原创 十_信号13 - abort()

2 要么在 SIGABRT信号的处理函数中 清理缓冲区并自己退出进程。如果信号处理函数中没有执行退出进程操作,返回到 abort()函数中,要求在 abort()函数中结束进程,不能返回到其调用者。1 首先进程不能忽略 SIGABRT信号。

2024-06-02 19:08:38 221

原创 十_信号11 - 函数sigsetjmp() 和 siglongjmp()

也就是说,正常情况下,当捕捉到一个信号,并调用该信号的信号处理程序时,被捕捉的信号会被加入到当前进程的信号屏蔽字中,以防止在本次信号处理程序还没有完成的时候,再次触发该信号, 发生重入。而sigsetjmp 可以设置选项保存 当前进程的信号屏蔽字,在信号处理程序中在屏蔽字中添加该信号,避免重入,而siglongjmp 则在返回时候可以恢复到之前的信号屏蔽字。而setjmp 与 longjmp 的组合使用。并不会在 从信号处理程序返回后 将屏蔽的信号恢复,即不会恢复执行该信号处理程序之前的信号屏蔽字状态。

2024-06-02 19:05:18 320

原创 十_信号9 - 函数sigpending

2024-06-02 18:50:49 285

原创 十_信号7-信号集

判断 信号是否存在于指定集合中。信号机类型:sigset_t。

2024-06-02 18:43:52 240

原创 十_信号6-kill() raise() alarm() pause()

所以 不建议使用 sleep(),理由是在 sleep() 是由 alarm() + pause()封装的环境中,当你程序中同时使用 sleep() 和 alarm()的时候,必然有覆盖一个 alarm,即 alarm() 和 sleep()当中必然会有一个失效。这种情况 中间程序 做了5秒以上的工作,那么5秒后 当此时信号来了,程序还没有执行到 signal() 也就看不到 给信号注册的新的行为:alarm_handler,那么就会沿用这个信号默认的行为,即终止程序。实验1 :alarm的基本用法。

2024-06-02 18:36:11 177

原创 十_信号4-SIGCHLD信号

在学习进程控制的时候,使用wait和waitpid系统调用何以回收僵尸进程,父进程可以阻塞等待,也可以非阻塞等待,采用轮询的方式不停查询子进程是否退出。采用这种方式时,main执行流中的父子进程都不会收到影响,当子进程退出时,handler执行流进行进程等待,回收子进程资源。父进程创建处子进程后,子进程在5次循环后退出,父进程始终循环。实际上,子进程的退出并不是悄无声息的,在子进程退出时,会发出SIGCHLD信号给父进程。可以看到,子进程在退出时,发出了编号为17的SIGCHLD信号,被父进程捕捉到了。

2024-06-02 18:28:47 226

原创 十_信号3-可重入函数

在自定义处理方式中,同样调用了insert函数向链表中插入一个节点node2,此时完整的执行了insert函数,但是在头节点和最开始那个节点之间同时有了node1和node2(如上图序号2和3)。在main函数中,使用insert向链表中插入一个节点node1,在执行insert的时,刚让头节点指向node1以后(如上图序号1),捕获到了信号,进入到了该信号的自定义处理方式中。如上图所示链表,在插入节点的时候捕获到了信号,并且该信号的自定义处理方式中也调用了插入节点的函数。

2024-06-02 18:26:17 352

原创 十_信号2-中断的系统调用

2024-06-02 18:23:54 74

原创 九_进程控制8-FreeBSD中进程-进程组-会话-控制终端之间的联系

FreeBSD 是一种类UNIX操作系统。

2024-04-29 10:41:13 115

原创 九_进程控制7-shell执行程序

前面描述了 不支持作业控制的shell 在执行命令时候,其进程 进程组 会话,前台进程之间的关系。由于不支持作业控制,所以不论命令标注是前台执行 还是 后台执行,相关的进程都在前台进程组,无后台进程组。可以控制产生 前台进程组 或者 后台进程组。如果不支持 作业控制,则无法控制产生后台进程组。即 不支持作业控制的shell 只有前台进程组。TPGID 控制终端进程组ID(由控制终端修改,用于指示当前前台进程组)使用支持作业控制的shell 对比分析。PPID 父进程ID。PGID 进程组ID。

2024-04-29 10:38:50 89

原创 九_进程关系6-作业控制

可以控制产生 前台进程组 或者 后台进程组。如果不支持 作业控制,则无法控制产生后台进程组。即 不支持作业控制的shell 只有前台进程组。

2024-04-29 10:35:46 93

原创 九_进程关系5-进程组与终端

2024-04-29 10:33:19 272

原创 九_进程关系4-控制终端-进程组-会话的关系

2024-04-29 10:32:11 211

原创 九_进程关系3-会话

2024-04-29 10:31:03 381

原创 九_进程关系2-进程组

2024-04-29 10:29:45 215

原创 九_进程关系1+1-终端设备

控制终端,即当前用户正在使用的终端,是一个映射,指向当前所使用的真正的虚拟终端(例如/dev/tty1,/dev/pts/0)。/dev/tty and /dev/console 可以简单的理解为 他们俩都代表当前打开的实际终端的链接,是映射到某个实际的虚拟终端的链接终端。在linux中,每一个系统与用户进行交流的界面称为终端(用户与进程交流的窗口),每一个从此终端开始运行的进程,都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。三 /dev/ttySn。

2024-04-29 10:28:36 226

原创 九_进程关系1-终端

控制台的特点在于它只能被管理员使用,且每一台计算机只能有一个控制台,它在外观上与普通终端并没有太大的差异,但是它具有最高的权限(例如以单用户模式启动操作系统时,控制台是唯一的可登录终端,其他终端是没有权限登陆的)。通过线缆连接在主机上,由于早期的计算机很贵很庞大,不可能人手一台,所以工作人员是通过终端设备来连接到计算机上,键盘提供文字输入,显示器提供文本输出,这样就提供了一个人机交互的接口。我们每天都用终端,终端中能玩儿俄罗斯方块,甚至能显示高清的图片,从上个实际的古董硬件发展到先到的软件工具。

2024-04-29 10:21:17 214

原创 八_进程控制14 - 进程时间

【代码】进程控制14 - 进程时间。

2024-04-28 21:39:36 103

原创 八_进程控制13 - 进程调度

相比之下 当父进程有最高的nice值(最低优先级)时,我们看到父进程占用 1.4%的CPU,而子进程占用 98.6%的CPU,这些值取决于进程调用程序如何使用nice值,因此不同的UNIX系统会产生不同的CPU占用比。当两个进程 nice值相同的时候,两个进程各自占用进阶50%的CPU。可以看到,两个进程被有效地进行了平等对待。百分比并不完全相同,是因为进程调度并不精确。

2024-04-28 21:36:03 164

原创 八_进程控制10 - 函数system()

2024-04-28 21:30:49 83

原创 八_进程控制7 - exec函数族

下面这个demo使用execl函数,传入path也就是execlnewpro的路径(这里也可以写绝对路径),argv的第一个参数是我们需要的可执行文件名字,abc是第二个参数,结尾必须以NULL结尾。如果execl执行后返回-1,代表没有这个文件,会执行printf(“execl filed!我们可以通过perror来打印错误信息,那么紧接着会执行printf(“Execute after failure!,因为filed会原程序的调用点接着往下执行。如果成功就直接去调用execlnewpro了。

2024-04-28 21:10:45 188

原创 八_进程控制6 - 获取子进程终止状态 wait()系列

2024-04-28 20:51:12 351

原创 八_进程控制5 - exit()退出+子进程被收养+僵死进程

我们应当知道的是,在用fork创建子进程后,父子进程的执行的先后顺序是不定的,这时,我们可以用wait函数,wait()会暂停当前进程的执行,直到有信号到来或者子进程结束。总的来说,wait()的作用就是阻塞父进程,等待子进程。我们是在父进程中使用wait(),可以不让父进程先于其产生的子进程结束,因为如果父进程结束了,而子进程还没有结束,那这个进程就会变成一个“孤儿进程”,他会被init进程收养(进程号为1),并由init进程对它们完成状态收集工作。

2024-04-28 20:43:49 242

原创 八_进程控制4 - vfork

2024-04-28 20:19:29 223

原创 八_进程控制3 - fork()详解,父子进程的文件共享

2024-04-28 20:14:37 148

原创 16_网络IPC14-Socket缓冲区,可读可写条件

1 首先会检查缓冲区,如果缓冲区的可用空间长度小于要发送的数据,那么 write()/send() 会被阻塞(暂停执行),直到缓冲区中的数据被发送到目标机器,腾出足够的空间,才唤醒 write()/send() 函数继续写入数据。2 如果TCP协议正在向网络发送数据,那么输出缓冲区会被锁定,不允许写入,write()/send() 也会被阻塞,直到数据发送完毕缓冲区解锁,write()/send() 才会被唤醒。1 首先会检查缓冲区,如果缓冲区中有数据,那么就读取,否则函数会被阻塞,直到网络上有数据到来。

2023-01-30 11:21:33 1509 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除