[英]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.