叉系统调用

时间:2017-04-09 14:23:36

标签: c fork

我试图在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?

另一个问题,这个输出总是一样的吗?!或者有时会倒置?!

亲切的问候

1 个答案:

答案 0 :(得分:2)

fork(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,就像在我的示例中一样。

未指明孩子或父母是先跑。它们甚至可以同时运行,因此线路可以反转,并且在非常罕见的情况下,您安装了信号处理程序并且它们被调用,甚至混合(但这种情况很难触发)。