当前位置: 技术问答>linux和unix
对fork()的理解
来源: 互联网 发布时间:2017-02-08
本文导语: 对fork()始终还是不太明白,看看这样理解是否正确 1个父进程(A)中调用1次fork()函数,该fork()函数若创建成功则返回2次,即0/正数值; 当返回0时,则该父进程(A)下创建了一个子进程(B),子进程(B)向其自身返回自身ID值; 当返回正...
对fork()始终还是不太明白,看看这样理解是否正确
1个父进程(A)中调用1次fork()函数,该fork()函数若创建成功则返回2次,即0/正数值;
当返回0时,则该父进程(A)下创建了一个子进程(B),子进程(B)向其自身返回自身ID值;
当返回正数值时,该父进程(A)下仍然创建同一个子进程(B),但该子进程(B)则向父进程(A)返回其ID值;
所以在以下函数中,调用1次返回2次,每次执行以下2条printf()语句,
因此获得值为2个子进程的ID和2个父进程的ID:
#include
main(){
fork();
printf("child id%dn",getpid());
printf("parent id%dn",getppid());
}
1个父进程(A)中调用1次fork()函数,该fork()函数若创建成功则返回2次,即0/正数值;
当返回0时,则该父进程(A)下创建了一个子进程(B),子进程(B)向其自身返回自身ID值;
当返回正数值时,该父进程(A)下仍然创建同一个子进程(B),但该子进程(B)则向父进程(A)返回其ID值;
所以在以下函数中,调用1次返回2次,每次执行以下2条printf()语句,
因此获得值为2个子进程的ID和2个父进程的ID:
#include
main(){
fork();
printf("child id%dn",getpid());
printf("parent id%dn",getppid());
}
|
给你改几行代码,就好懂了。
在sleep执行时,另开一个命令行,打一下"ps",你会发现有两个名字相同的进程。
这就是说,fork执行完以后,你有两个一模一样的程序在系统里。这就是fork的本质。
新的程序是从原程序的执行体上复制出来的,新程序执行的起点就是你调用fork的那个点。
所以,你看到的输出其实是来自两个程序。他们为父子关系,从各自打出的ID就能看出来。
在新的程序里,fork返回的是0.
在父程序里,fork返回的是新程序的pid。
#include
#include
main()
{
pid_t id = fork();
sleep(10);
if(id==0)
{
printf("--- id%dn",id);
printf("---child id%dn",getpid());
printf("---parent id%dn",getppid());
}
else
{
printf("id%dn",id);
printf("child id%dn",getpid());
printf("parent id%dn",getppid());
}
}
在sleep执行时,另开一个命令行,打一下"ps",你会发现有两个名字相同的进程。
这就是说,fork执行完以后,你有两个一模一样的程序在系统里。这就是fork的本质。
新的程序是从原程序的执行体上复制出来的,新程序执行的起点就是你调用fork的那个点。
所以,你看到的输出其实是来自两个程序。他们为父子关系,从各自打出的ID就能看出来。
在新的程序里,fork返回的是0.
在父程序里,fork返回的是新程序的pid。