【网络编程】多进程编程

文章目录

  • 一、fork系统调用
  • 二、exec系列系统调用
  • 三、处理僵尸进程
  • 四、管道
  • 五、信号量
  • 六、共享内存
  • 七、消息队列


一、fork系统调用

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

#include 
#include 
pid_t fork(void);

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

二、exec系列系统调用

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

#include 
/*环境变量指针数组地址*/
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高性能服务器编程》学习笔记

你可能感兴趣的:(网络编程,网络)