-
fork()是内核程序创建进程的一种方式,由fork()创建的新进程被称为子进程(child process)。需要特别注意的是:该函数被调用一次,但返回两次。两次分别返回父进程和子进程。子进程的返回的是0(内核代码中设定的为0),而父进程返回的是子进程的进程PID。
代码示例如下:
相当于在fork之后,有两个进程(子进程和父进程)在执行fork之后的代码。但是父进程先执行,所以进了else ,子进程后执行,进if。 -
父进程和子进程共享代码段,但是分别拥有自己的数据段和堆栈段。一个进程的子进程可以不止一个。
-
fork之后,操作系统会拷贝出一个与父进程完全相同的子进程,这两个进程共享代码段空间,但是数据段是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,子进程拥有父进程当前运行到的位置(两进程的程序计数器pc值相同,也就是说,子进程是从fork返回处开始执行的)。
-
有两个对立的观点,一是说:父进程先返回(因为对父进程来说,fork执行过程相当于函数调用);另一个中观点是说:父子进程哪个先运行与操作系统的调度有关,如果需要父子进程协同,可以通过原语的办法解决。
#include <unistd.h> //fork()
#include <sys/types.h>
#include <stdio.h> //puts()
int main()
{
int status;
puts("start");
//创建子进程
pid_t pid = fork();
if(pid==-1){
perror("创建子进程失败");
return 1;
}
//判断是否是子进程
if(pid==0){
puts("I'm child");
puts("sleep 5s ...");
sleep(5);
puts("sleep end");
printf("子进程PID是%d\n", getpid());
printf("父进程PID是%d\n", getppid());
return 0;
}
else{
puts("I'm parent");
printf("子进程PID是%d\n", pid);
printf("父进程PID是%d\n", getpid());
}
wait(&status);
printf("%d\n", status);
puts("main end");
return 0;
}
运行结果:
start
I'm parent
子进程PID是22875
父进程PID是22874
I'm child
sleep 5s ...
sleep end
子进程PID是22875
父进程PID是22874
0
main end
网友评论