繁体   English   中英

C语言中fork()的父级和子级

[英]Parent and child of fork() in C

由于每个过程都在做自己的事情,对我来说,这更像是“兄弟/姐妹”关系。 将它们称为父进程和子进程有什么特定的原因吗?

而且,父进程始终在子进程之前运行是否正确?

父级拥有进程组,因此产生并收获子级。 通常,此过程需要一点点管理工作,而孩子则充当同伴和兄弟姐妹。

不过,命名只是约定,用于描述哪个进程产生了另一个进程。

父进程和子进程根据您的代码执行工作,但不是由于父子关系。 当您在主线程中执行fork()时,它将创建一个子进程,这里的fork返回一个在父进程和子进程中不同的值,该值可用于区分父子进程的工作。 fork()在父进程中始终返回子进程的pid,在子进程中始终返回0。

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

将它们称为父进程和子进程有什么特定的原因吗?

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

而且,父进程始终在子进程之前运行是否正确?

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

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

您可能还想使用

waitpid(pid, NULL, 0);

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

因此,父进程始终是对fork()进行调用的进程,如果那是您首先要运行的意思。 如果您的意思是“调度程序将始终首先提供父进程分片”,那么答案是否定的。

参见: http : //gauss.ececs.uc.edu/Courses/c694/lectures/ForksThreads/forks.html,http : //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;
}

父母总是比孩子先。 排序和甜美!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM