我试图在c中执行以下代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
int main()
{
int pid;
pid = fork ();
printf ("%d \n", pid());
}
我得到以下结果:
17601
0
var pid应该存储进程ID的值吗?!
以下哪一项是父项,哪项是孩子的ID? 更具体一点,我想知道fork()系统调用的返回值是什么?!为什么在其中一个过程中它为0?
另一个问题,这个输出总是一样的吗?!或者有时会倒置?!
亲切的问候
答案 0 :(得分:2)
返回值
成功完成后,fork()将向孩子返回0 进程并将子进程的进程ID返回给 父母过程。这两个过程都将继续执行 fork()函数。否则,-1将返回给父母 进程,不应创建子进程,并设置errno 表明错误。
这可能是一个更具说明性的例子:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
pid = fork ();
printf ("returned=%ld from %ld\n", (long)pid, (long)getpid());
}
可能会为您提供输出,如:
returned=22231 from 22229
returned=0 from 22231
请注意,fork()
会返回pid_t:
实现应支持一个或多个编程环境 其中blksize_t,pid_t,size_t,ssize_t和。的宽度 suseconds_t 不大于long类型的宽度。
突出显示的部分意味着pid_t
可以使用stdio通过强制转换打印到long
,就像在我的示例中一样。
未指明孩子或父母是先跑。它们甚至可以同时运行,因此线路可以反转,并且在非常罕见的情况下,您安装了信号处理程序并且它们被调用,甚至混合(但这种情况很难触发)。