【网络编程】多进程编程

本文介绍了Linux下的fork系统调用、exec系列系统调用,涉及如何处理僵尸进程,以及管道、信号量、共享内存和消息队列等进程间通信方式。这些技术对于高性能服务器编程至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、fork系统调用

  Linux下创建新进程的系统调用是fork,该函数每次调用都会返回两次,在父进程中返回子进程的pid,在子进程中返回0,失败是都会返回-1并设置error,所以,该返回可以用来判断子进程是否成功创建以及判断当前进程是父进程还是子进程。

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);

  使用fork复制当前进程时,子进程会复制父进程的堆指针、栈指针、标志寄存器的值、代码、堆数据、栈数据和静态数据等,并且对数据的复制是采用写时复制。写时复制指的是在父进程或者子进程中对数据执行了写操作时,复制才会发生(复制的过程为,先是缺页中断,然后操作系统给子进程分配内存并复制父进程的数据)。在这里也有许多属性被赋予了新值,包括该进程的PPID被设置为了PID,信号位图被清除(这将导致原进程设置的信号处理函数将对新进程不起作用。
  从引用计数的角度来说,父进程中打开的文件描述符在子进程中也是打开的,且文件描述符的引用计数加1,并且,父进程的用户根目录,当前工作目录等变量的引用计数都会加1。

二、exec系列系统调用

  exec系列的系统调用主要是在子进程中替换当前的进程映像并执行其他程序。

#include <unistd.h>
/*环境变量指针数组地址*/
extern char** environ;

int execl(const char* path, const char* arg, ...);
int execlp(const char* file, const char* arg, ...);
int execle(const char* path, const char* arg, ..., char* const envp[]);
int execv(const char* path, char* const argv[]);
int execvp(const char* file, char* const argv[]);
int execve(const char* path, char* const argv[], char* const envp[]);

  其中,path表示可执行文件的完整路径,file参数可以接收文件名,该文件具体位置在path中搜寻,arg接收可变参数,argv接收参数数组,envp用于设置新程序的环境变量。
  一般情况下,exec函数不返回,除非出错,他出错时返回-1并设置errno。

三、处理僵尸进程

处理僵尸进程

四、管道

  管道是父进程与子进程间通信的常用手段。它能在父进程与子进程之间通信,利用的是fork之后两个管道文件描述符fd[0]和fd[1],一对这样的文件描述符只能支持一个方向的通信,所以,要实现父子进程之间的双向通信,就必须使用两个管道。
  不过,管道只能用于两个有关系的进程之间的通信,要想在无关联的进程之间进行数据交换,则需要使用信号量、共享内存、消息队列。还有一种特殊管道(FIFO命名管道)也能用于无关联进程之间的通信,但是在网络编程中使用不多。

五、信号量

信号量

六、共享内存

共享内存

七、消息队列

消息队列


《Linux高性能服务器编程》学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rockict_z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值