当前位置: 技术问答>linux和unix
对fork()的不解
来源: 互联网 发布时间:2015-12-25
本文导语: #include #include main() { pid_t val; printf("PID before fork():%dn",(int)getpid()); if (val=fork()) printf("parent PID :%dn",(int)getpid()); else printf("child pid: %d n",(int)getpid()); } 输出...
#include
#include
main()
{
pid_t val;
printf("PID before fork():%dn",(int)getpid());
if (val=fork())
printf("parent PID :%dn",(int)getpid());
else
printf("child pid: %d n",(int)getpid());
}
输出结果:
PID before fork():3229
child pid: 3231
parent PID :3229
不解的问题:
1.为什么if的两条语句都会被执行 ?
2.为什么childpid值为3231,为什么不是3230 ?
#include
main()
{
pid_t val;
printf("PID before fork():%dn",(int)getpid());
if (val=fork())
printf("parent PID :%dn",(int)getpid());
else
printf("child pid: %d n",(int)getpid());
}
输出结果:
PID before fork():3229
child pid: 3231
parent PID :3229
不解的问题:
1.为什么if的两条语句都会被执行 ?
2.为什么childpid值为3231,为什么不是3230 ?
|
fork之后有两个进程, 父进程跑的是if的第一个分之, 子进程跑的是if的第2个分之.
为什么childpid值为3231,为什么不是3230?
Linux的进程id是递增的,但linux是多任务的系统,有很多内核线程或者其他进程也参与了调度,
如果在这期间有一个进程被创建而站用了3230, 那么childpid为3231也不足为奇
为什么childpid值为3231,为什么不是3230?
Linux的进程id是递增的,但linux是多任务的系统,有很多内核线程或者其他进程也参与了调度,
如果在这期间有一个进程被创建而站用了3230, 那么childpid为3231也不足为奇
|
因为fork调用一次却返回两次,在调用它的父进程,它返回一次,返回值是派生子进程的ID,在子进程,它返回一次,返回值为0。所以,两条if语句都被执行了,事实上,两个if语句是在两个进程里面分别执行的。
2,理由同楼上,由可能该id被其他进程占用了
2,理由同楼上,由可能该id被其他进程占用了
|
because, fork() copys the parent process as child porcess. so the child and parent are the same before exec(). the difference is that in child fork() returns 0, in parent fork() returns the child id. You can think the fork() as:
1) the main() runs to (val = fork())
2) fork() system call copys the parent process wholely. so the child is the same as parent
3) so the parent and child will seperately run from returning from (val = fork())
4) in child, fork() returns 0.so the if(val=for()) statement is evaluated as false,
5) in parent, fork() returns pid. so the if(val=for()) statement is evaluated as true.
Regards
1) the main() runs to (val = fork())
2) fork() system call copys the parent process wholely. so the child is the same as parent
3) so the parent and child will seperately run from returning from (val = fork())
4) in child, fork() returns 0.so the if(val=for()) statement is evaluated as false,
5) in parent, fork() returns pid. so the if(val=for()) statement is evaluated as true.
Regards
|
it depends on how you run your program, on the terminal or redirecting output to the file..
http://community.csdn.net/Expert/TopicView3.asp?id=5172585
http://community.csdn.net/Expert/TopicView3.asp?id=5172585