我有一个作业,要求我在A,B,C和D行识别进程ID的值,假设父和子的实际pid分别为2600和2603。
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main(){
pid_t pid, pid1;
/* fork a child process */
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed");
return 1;
}
else if(pid == 0){ /* child process */
pid1 = getpid();
printf("child: pid = %d", pid); /* A */
printf("child: pid1 = %d", pid1); /* B */
}
else { /* parent process */
pid1 = getpid();
printf("parent: pid = %d", pid); /* C */
printf("parent: pid1 = %d", pid1); /* D */
wait(NULL);
}
}
我已经获得了问题的解决方案,但我无法理解fork()
功能。为什么它会返回-1,0或某个正数?为什么它不能始终如一地返回某个值?例如,当我们分配pid = fork()
时,它可以是-1,0或某个正数的值。即使我知道,我也不知道价值观是如何变成现实的。我知道,最初,子进程被给予父数据的副本。通常,我的策略是逐行遍历代码并在修改变量时调整变量以确定输出,但这个例子似乎是不确定的。我觉得我完全错误地看待这个问题,但我不知道如何改变我的思维过程。我已经查看了fork()here的文档,但它没有为我澄清任何内容。
另外,为什么我们不在if / else-if语句中使用get函数,即pid.getID()
?这是否意味着pid_t
和int
是等价的?
非常感谢对此代码的逐步说明。
作为参考,解决方案是0,2603,2603和2600。
答案 0 :(得分:3)
fork()
创建一个与原始流程几乎完全相同的新流程。从返回fork()
函数开始,这两个进程都继续运行。在父进程中,fork()
返回子进程的PID(正数),而在子进程fork()
中返回0
(这就是它知道它是孩子的方式)。 / p>
如果由于某种原因,系统无法创建新进程,fork()
会在父级中返回-1
而不是子级的PID,并且errno
设置为错误代码以及失败的原因。
您可以使用getpid()
进行等效测试,这只会更有效:
pid_t parentPID = getpid();
fork();
pid_t myPID = getpid();
if (myPID == parentPID) {
// this is the parent
} else {
// this is the child
}
在孩子中fork()
返回0
可以简化它,因为您可以从该一次通话中获得所需的所有信息,而无需再拨打getpid()
两次。