C语言中fork()的父和子

时间:2014-02-25 07:07:38

标签: c process fork

由于每个过程都在做自己的事情,这让我觉得更像是“兄弟/姐妹”的关系。调用父进程和子进程后是否有特定原因?

此外,父进程是否始终在子进程之前运行?

5 个答案:

答案 0 :(得分:1)

父母拥有进程组,从而产生并收获子进程。通常这个过程会做一些管理工作,而孩子则扮演同龄人和兄弟姐妹的角色。

命名只是描述哪个进程产生了另一个进程的惯例。

答案 1 :(得分:0)

父进程和子进程根据您的代码执行工作,但不是因为父或子关系。当你在主线程中执行fork()时,它将创建一个子进程,这里fork返回一个在父进程和子进程中不同的值,可以用来相应地区分父进程和子进程的工作。 fork()总是在父进程中返回子进程的pid,在子进程中返回0。

转到第二个问题,一旦fork()被调用,它总是依赖于调度程序,并且我们无法预测在fork()函数调用之后首先运行哪个进程。

答案 2 :(得分:0)

  

调用父进程和子进程后是否有特定原因?

好吧,因为它创建了第二个进程(父进程)(子进程),这可能是命名的原因。

  

此外,父进程是否始终在子进程之前运行?

简短的回答。不。 我一直在我的所有C代码中使用它

pid_t pid = fork();
  if(pid == 0){ // child     
    // Child stuff
  }else{ // parent
    // Parent stuff
}

您可能还想使用

waitpid(pid, NULL, 0);

答案 3 :(得分:0)

fork()创建当前进程的副本,该进程是进程控制组的一部分。新进程从属于原始进程,例如当进程终止时,SIGCHLD将发送给父进程。此外,克隆是一个劣质副本:例如,任何存储的getpid()结果在孩子中都是不准确的;子项具有不同的parentid,子项具有父项文件描述符的副本,并且具有独立的资源使用计数器。

然后,父进程始终是调用fork()的进程,如果这是您首先运行的意思。如果你的意思是“调度程序是否总是首先给父进程切片”,那么答案就是否定。

请参阅:http://gauss.ececs.uc.edu/Courses/c694/lectures/ForksThreads/forks.htmlhttp://linux.die.net/man/2/fork

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char* argv[])
{
    pid_t otherPid;

    printf("parent pid = %u\n", getpid());

    otherPid = fork();
    // in the parent, otherPid = the child's (new) process ID
    // in the child, otherPid = 0.

    switch (otherPid) {
        case -1:
            printf("Fork failed: %d\n", errno);
            return errno;
        break;
        case 0: // child
            sleep(2);
            printf("child: my pid is %u\n", getpid());
        break;
        default:
            printf("parent: pid is %u, child should have %u\n", getpid(), otherPid);
            sleep(3);
        break;
    }

    return 0;
}

答案 4 :(得分:0)

父母总是在孩子面前。排序和甜蜜!!!