父子进程概述
总结了两篇博客,对父子进程涉及的问题进行了简要总结(参考博客在文章末尾)
创建进程的目的一般有两个:
- 一是父进程希望生成一份自己的副本,执行同一个程序中不同的代码片段。
- 二是让子进程执行不同的程序。
在父进程中使用fork
函数创建子进程,方式是直接pid_t id = fork();
,
其中父子进程对应的返回值不同:若返回值为0表示子进程创建成功(进入子进程的执行)、大于零说明是在父进程执行(这时返回值是子进程的PID),失败为-1
创建子进程时,父子进程数据共享,当任一方对共享数据做了改动,就会发生写时拷贝,即分配新的物理地址给要修改的一方,这保证了进程的独立性
当系统中进程数量过多或用户的进程数量过多可能导致进程创建失败
进程退出的方式有:exec
、_exec
、main
函数中的return
三者,其中exec
是_exec
的一种封装,即_exec
是系统调用,exec
是库函数
此外,当ctrl+c
或 kill
时会使进程异常退出
进程等待是指父进程等待子进程退出,不然会出现kill
不掉的僵尸子进程,方式有wait
、waitpid
两种,
对waitpid
的参数进行进行设置可有阻塞、非阻塞等待两种方式
要使得子进程能够执行不同的程序,可以使用exec
系列函数
目的1示例(引自参考二):
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
/*
创建子进程,通过父进程和子进程返回值的不同,使得父进程和子进程执行不同的代码分支
*/int main(){//创建子进程pid_t val=fork();//判断父子进程if(val<0){ //返回值小于0,说明子进程创建失败printf("create error\n");}else if(val==0){ //返回值等于0,说明进入这里的是子进程printf("this is son\n");}else{ //返回值大于0,说明进入这里的是父进程printf("this is father\n");}return 0;
}
目的2示例(引自参考一):
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{int id = fork();if(id == 0) // 子进程{execl("/usr/bin/ls","ls","-l","-a","--color=auto",NULL);exit(1); // 因为execl会替换新的程序,所以如果子进程走到这里替换必定失败}wait(NULL); // 父进程回收子进程return 0;
}
参考一:【Linux】进程控制:父进程与子进程_linux父子进程-CSDN博客
参考二:Linux 进程:父子进程-CSDN博客