2014-02-25 133 views
0

由于每个过程都在做自己的事情,对我来说这更像是一种“兄弟/姐妹”关系。将他们称为父进程和子进程的背后有一个特定的原因吗?父母和孩子的叉()在C

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

+0

不确定这个问题的第二部分是什么意思。谨慎阐述? –

+1

1.孩子是由父母创建的。 2.没有。 – moeCake

+0

@ mike.dld我有一个代码,只是打印“父母”和“孩子”为每个相应的进程,并且“父母”总是首先打印? – Pig

回答

1

父母拥有进程组,从而产生和收获孩子。通常这个过程会做一点行政工作,而孩子们则扮演同龄人和兄弟姐妹。

虽然命名只是描述哪个进程产生了另一个进程的约定。

+2

也有一些情况,它不仅是约定。例如,如果调用进程不是传递'pid'的父进程,'waitpid()'拒绝工作,返回'ECHILD'错误。 –

+0

@ mike.dld是的,这就是我的产卵和收获。在一个蹩脚的设备上键入:)请随时编辑答案是更彻底或写出一个,我会删除:) –

0

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

即将到来的第二个问题是,调用fork()后,它总是依赖于调度程序,并且我们无法预测fork()函数调用后哪个进程首先运行。

+0

我有一个代码,只是打印“父母”和“孩子”为每个相应的进程,和“父母”总是被首先打印? – Pig

+0

调用fork()之后,您的父节点正在获取CPU时间,因此它正在执行并且稍后孩子正在获取CPU时间。如果你想让你的孩子先运行,然后再运行父进程,那么你可以使用vfork()来使子进程和父进程同步运行。 fork()调用后的结果完全依赖于调度程序。 – prince

0

是否有一个特定的原因背后调用他们的父进程和子进程?

那么,因为它创建第二个(子)的一个进程(父),这可能是命名的推理。

另外,父进程是否总是在子进程之前运行?

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

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

您可能还需要使用

waitpid(pid, NULL, 0); 
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; 
} 
+1

我认为你应该使用C语法,而不是C++,因为这是C标签。 – moeCake

+0

奇怪的是,它出现在C++标签下。改性。 – kfsone

0

父母总是孩子之前。分类和甜蜜!

+1

这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 – quetzalcoatl

+0

问题是“父进程是否真的在子进程之前运行?”所以我重新排序。 – Amit

+1

不,问题是“是否有将其称为父进程和子进程的特定原因?”。请尝试阅读全文,不仅是标题和结尾。你刚才引用的问题是一个侧面问题。你的回答,如果它是一个预期的答案(而不仅仅是半开玩笑 - 半真相),还不清楚。试着详细阐述一下。如果你的意思是“在...之前”,就社会/进化论的参考而言 - 写出来。如果你的意思是“之前”的“观看/保护” - 写它。如果你不想长时间写清楚 - 如果已经有很好的答案,为什么要写? – quetzalcoatl