进程ID和fork()

时间:2015-09-25 01:49:07

标签: c unix fork

我有一个作业,要求我在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_tint是等价的?

非常感谢对此代码的逐步说明。

作为参考,解决方案是0,2603,2603和2600。

1 个答案:

答案 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()两次。