我有一个任务,要求我标识A、B、C和D行的进程is的值,假设父进程和子进程的实际pids分别为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或某个正数。即使我知道这一点,我也不知道这些价值是如何变成现在的样子的。我知道,最初,子进程会得到父数据的副本。通常,我的策略是逐行遍历代码,并在修改变量时调整它们以确定输出,但这个示例似乎不确定。我觉得我对这个问题的看法是完全错误的,但我不知道如何改变我的思维过程。我已经查看了here () fork()的文档,但它并没有为我澄清任何事情。
另外,为什么我们不在if/else-if语句中使用get函数,比如pid.getID()?这不是意味着pid_t和int是等价的吗?
如果您能一步一步地解释这段代码,我们将不胜感激。
作为参考,解决方案为0、2603、2603和2600。
发布于 2015-09-25 09:53:13
fork()创建了一个与原始进程几乎完全相同的新进程。从返回fork()函数开始,这两个进程都会继续运行。在父进程中,fork()返回子进程的PID (一个正数),而在子进程中,fork()返回0 (这就是它知道自己是子进程的原因)。
如果由于某种原因,系统无法创建新进程,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()两次。
https://stackoverflow.com/questions/32773545
复制相似问题