fork作用:
创建一个原有进程的精确副本,包括所有的文件描述符,寄存器等全部内容。
父进程与子进程的关系:
#include "unistd.h";
#include "sys/types.h";
void main(){
pid_t pid;
pid = fork();
if(pid < 0)
printf("error in fork");
else if(pid == 0)
printf("I'm the child process, my process ID is %d\n", getpid());
else
printf("I'm the parent process, my process ID is %d\n", getpid());
}
结果是:
[root@xxxxx]# ./a.out I'm the child process, my process ID is 5146 I'm the parent process, my process ID is 5145
为什么这两行都打印出来了?
在fork之后,操作系统会复制一个与父进程完全相同的子进程,这两个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同:
1. 如果fork成功,子进程中fork的返回值是0,父进程中的fork返回值是子进程的进程号;
2. 如果fork不成功,父进程会返回错误;
创建进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看操作系统的进程调度策略。每个进程都有一个独特的进程标识符(process ID),可以通过getpid()函数获得变量的值。
值得注意的是:1.父进程和子进程的变量都是相互独立的,存在不同的地址中,并不是共用的;2.fork只是把当前的情况拷贝一份,执行fork时,进程已经执行完了fork之前的代码。fork只拷贝下一个要执行的代码到新的进程。