linux fork()的进程问题
对fork()始终还是不太明白,看看这样理解是否正确1个父进程(A)中调用1次fork()函数,该fork()函数若创建成功则返回2次,即0/正数值;当返回0时,则该父进...
对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<stdio.h>
main(){
fork();
printf("child id%d\n",getpid());
printf("parent id%d\n",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<stdio.h>
main(){
fork();
printf("child id%d\n",getpid());
printf("parent id%d\n",getppid());
} 展开
1个回答
展开全部
没看明白你是怎么理解的
就按照你的代码示例来说, 这段代码从A进程fork一个B进程出来,运行结果是打印4行消息
child id xxx1 // pid of process A
parent id xxx2 // pid of A's parent process
child id xxx3 // pid of process B
parent id xxx4 //pid of B's parent process, exactly equal to the pid of process A
以上这四行输出有可能A在B的前面,或者B在A的前面,不确定(如果你的CPU是多核);但child总在parent的前面。
事实上关于fork的理解是这样的, A fork一个进程B出来, A和B都要接着往下运行,但是一般来说A和B是要运行不同的代码的,那这时候fork执行完接着执行下一句的时候,就需要首先知道当前的context是在A进程中还是在B进程中, 这样才能确定接着执行什么。 所以fork就需要返回两次, 确切的讲是在A和B的context中分别返回一次,在A的context中返回的是子进程的pid, 在B的context中返回0,所以创建进程时往往会这样写
int ret = fork();
if(0 == ret)
{
printf("hey, I am the child -- Process B\n");
//start to do what you want to handle in Process B
}
else //if ret > 0
{
printf("hey, I am the parent -- Process A\n");
//continue doing what you are working on in Process A
}
通过判断 fork的返回值来确定当前context是属于哪个进程,并执行相应的代码,开始在两个进程中做各自的事情。
就按照你的代码示例来说, 这段代码从A进程fork一个B进程出来,运行结果是打印4行消息
child id xxx1 // pid of process A
parent id xxx2 // pid of A's parent process
child id xxx3 // pid of process B
parent id xxx4 //pid of B's parent process, exactly equal to the pid of process A
以上这四行输出有可能A在B的前面,或者B在A的前面,不确定(如果你的CPU是多核);但child总在parent的前面。
事实上关于fork的理解是这样的, A fork一个进程B出来, A和B都要接着往下运行,但是一般来说A和B是要运行不同的代码的,那这时候fork执行完接着执行下一句的时候,就需要首先知道当前的context是在A进程中还是在B进程中, 这样才能确定接着执行什么。 所以fork就需要返回两次, 确切的讲是在A和B的context中分别返回一次,在A的context中返回的是子进程的pid, 在B的context中返回0,所以创建进程时往往会这样写
int ret = fork();
if(0 == ret)
{
printf("hey, I am the child -- Process B\n");
//start to do what you want to handle in Process B
}
else //if ret > 0
{
printf("hey, I am the parent -- Process A\n");
//continue doing what you are working on in Process A
}
通过判断 fork的返回值来确定当前context是属于哪个进程,并执行相应的代码,开始在两个进程中做各自的事情。
更多追问追答
追问
按你这么说的,那即是main()为父进程A;fork()出来的进程为子进程B;
child id xxx1 //父进程A本身的ID
parent id xxx2 //创建父进程A的进程的ID
child id xxx3 // fork()出来的子进程B的ID
parent id xxx4 //子进程B的父进程的ID,即是A的ID
追答
没看明白你追问什么. 也不明白"main()为父进程A"是什么意思
main只是一个代函数名,是代码, 进程是执行代码的容器.
就你这个main函数
main(){
fork();
printf("child id%d\n",getpid());
printf("parent id%d\n",getppid());
}
它在父进程A和子进和B中都被执行了. 所以尽管main中只有两个printf,但运行结果却会打印出4行信息.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询