C中fork()的父级和子级

C中fork()的父级和子级,c,process,fork,C,Process,Fork,因为每个过程都在做自己的事情,这对我来说更像是一种“兄弟姐妹”关系。将它们称为父进程和子进程背后是否有特定的原因 另外,父进程总是在子进程之前运行,这是真的吗?父进程拥有进程组,因此生成并获取子进程。通常这个过程会做一些管理工作,而孩子们则扮演着同龄人和兄弟姐妹的角色 命名只是描述哪个进程产生了另一个进程的惯例。父进程和子进程根据您的代码进行工作,但不是因为父进程或子进程的关系。当您在主线程中执行fork()时,它将创建一个子进程,在此fork返回一个在父进程和子进程中不同的值,该值可用于相应地

因为每个过程都在做自己的事情,这对我来说更像是一种“兄弟姐妹”关系。将它们称为父进程和子进程背后是否有特定的原因


另外,父进程总是在子进程之前运行,这是真的吗?

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


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

父进程和子进程根据您的代码进行工作,但不是因为父进程或子进程的关系。当您在主线程中执行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()
结果在子级中都不准确;子项具有不同的
父项ID
,子项具有父项文件描述符的副本,并且具有独立的资源使用计数器

那么,父进程总是调用
fork()
,如果这就是您所说的先运行的话。如果您的意思是“调度器是否总是先给父进程切片”,那么答案是否定的

见:

#包括
#包括
int main(int argc,const char*argv[]
{
pid_t其他pid;
printf(“父pid=%u\n”,getpid());
otherPid=fork();
//在父级中,otherPid=子级的(新)进程ID
//在子对象中,otherPid=0。
开关(其他PID){
案例1:
printf(“Fork失败:%d\n”,错误号);
返回errno;
打破
案例0://儿童
睡眠(2);
printf(“子:我的pid是%u\n”,getpid());
打破
违约:
printf(“父项:pid为%u,子项应具有%u\n”、getpid()、otherPid);
睡眠(3);
打破
}
返回0;
}

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

不知道你所说的问题的第二部分是什么意思。想详细说明一下吗。子项由父项创建。2.不。@mike.dld我有一个代码,只需为每个对应的编码过程打印“家长”和“孩子”,而“家长”总是先打印出来吗?@LesbianSquirtle我相信这只是巧合,请查看下面的答案。在具有其他调度器的其他系统上,顺序可能会更改。它甚至可能在同一个系统上发生变化,这取决于执行
fork()
时时间片是否接近尾端。在某些情况下,这不仅仅是惯例。例如,
waitpid()
如果调用进程不是传递的
pid
的父进程,则拒绝工作,返回
ECHILD
错误。@mike.dld是的,这就是我所说的spawn&reaw。在一个蹩脚的设备上输入:)请随意编辑答案以便更彻底,或者写出一个答案,我将删除:)我有一个代码,只需为每个对应的编码过程打印“父”和“子”,并且在调用fork()之后,“父”总是先打印出来您的父级正在获得CPU时间,因此它将被执行,稍后子级将获得CPU时间。如果您想让您的孩子先运行,然后再运行家长,您可以使用vWork(),这将使孩子和家长以同步方式运行。Frack()调用后的结果完全依赖于调度器。我认为您应该使用C语法,而不是C++,因为这是C标签。奇怪的是,它出现在C++标签下。已修改。这不提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时在自己的帖子上发表评论,一旦您有足够的评论,您就可以发表评论。问题是“父进程是否总是在子进程之前运行?”所以我会按顺序重播。否,问题是
将它们称为父进程和子进程背后是否有特定的原因?
。请尽量阅读全文,而不仅仅是标题和结尾。你刚才引用的问题是一个附带问题。如果你的回答是有意的(而不仅仅是喋喋不休的半笑话半事实),那么你的回答就不清楚了。试着再详细一点。如果你在社会/进化方面的意思是“在之前”,那么就这样写吧。如果你在“监视/保护”一词中指的是“之前”,那么就这样写吧。如果你不想写得又长又清楚——如果已经有好的答案,为什么还要写呢?
#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;
}