叉子究竟返回了什么?

时间:2011-04-07 07:39:59

标签: c linux fork

  

成功时,孩子的PID   进程在父进程中返回   执行的线程,0是          在孩子的执行线程中返回。

p = fork();

我对其手册页感到困惑,p等于0PID

8 个答案:

答案 0 :(得分:48)

我不确定手册如何更清晰! fork()创建了一个新流程,因此您现在有两个相同的流程。为了区分它们,fork()的返回值不同。在原始过程中,您将获得子进程的PID。在子进程中,您得到0。

所以规范使用如下:

p = fork();
if (0 == p)
{
    // We're the child process
}
else if (p > 0)
{
    // We're the parent process
}
else
{
    // We're the parent process, but child couldn't be created
}

答案 1 :(得分:29)

                             p = fork();
                        /* assume no errors */
                        /* you now have two */
                        /* programs running */
                         --------------------
      if (p > 0) {                |            if (p == 0) {
        printf("parent\n");       |              printf("child\n");
        ...                       |              ...

答案 2 :(得分:8)

执行fork后,您有两个进程。该调用为每个进程返回不同的值。

如果你这样做

int f;
f = fork();
if (f == 0) {
  printf("I am the child\n");
} else {
  printf("I am the parent and the childs pid is %d\n",f);

}

您将看到两条消息都已打印出来。它们由两个独立的过程打印。这是他们可以区分创建的两个进程的方式。

答案 3 :(得分:6)

流程在 定向树 中构建,您只知道您的单亲(getppid())。简而言之,fork()在错误时返回-1,就像许多其他系统函数一样,非零值对于fork调用的启动程序(父级)有用,以便知道它的新子pid。

没有什么比例子更好:

/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h>     /* fork(), getpid() */
#include <stdio.h>

int main(int argc, char* argv[])
{
    int pid;

    printf("Entry point: my pid is %d, parent pid is %d\n",
           getpid(), getppid());

    pid = fork();
    if (pid == 0) {
        printf("Child: my pid is %d, parent pid is %d\n",
               getpid(), getppid());
    }
    else if (pid > 0) {
        printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n",
               getpid(), getppid(), pid);
    }
    else {
        printf("Parent: oops! can not create a child (my pid is %d)\n",
               getpid());
    }

    return 0;
}

结果(bash是pid 2249,在这种情况下):

Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051

如果您需要在父级和子级之间共享一些资源(文件,父级pid等),请查看clone()(对于GNU C库,可能还有其他人)

答案 4 :(得分:4)

这是很酷的部分。 等于两个人。

嗯,不是真的。但是一旦fork返回,您现在有两个程序副本正在运行!两个进程。您可以将它们视为替代宇宙。在一个中,返回值为0。另一方面,它是新流程的ID

通常你会有这样的事情:

p = fork();
if (p == 0){
    printf("I am a child process!\n");
    //Do child things
}
else {
    printf("I am the parent process! Child is number %d\n", p);
    //Do parenty things
}

在这种情况下,两个字符串都会打印出来,但是会有不同的过程!

答案 5 :(得分:1)

在父进程中调用

fork()。然后生成子进程。当子进程生成时,fork()已完成执行。

此时,fork()已准备好返回,但它会返回不同的值,具体取决于它是在父项还是子项中。在子进程中,它返回0,并在父进程/线程中返回子进程ID。

答案 6 :(得分:1)

Fork创建了一个重复的进程和一个新的进程上下文。当它返回0值时,表示子进程正在运行,但是当它返回另一个值时,表示父进程正在运行。我们通常使用wait语句,以便子进程完成,父进程开始执行。

答案 7 :(得分:0)

我认为它的工作原理如下: 当pid = fork()时,代码应该执行两次,一个是当前进程,一个是子进程。 所以它解释了为什么if / else都执行。 顺序是,第一个当前进程,然后执行子进程。