C 进程ID和fork()
我有一个任务,要求我识别第A、B、C和D行中进程ID的值,假设父进程和子进程的实际PID分别为2600和2603C 进程ID和fork(),c,unix,fork,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 */
#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);
}
}
#包括
#包括
#包括
int main(){
pid_t pid,pid 1;
/*派生子进程*/
pid=fork();
如果(pid<0){/*发生错误*/
fprintf(标准“Fork Failed”);
返回1;
}
如果(pid==0){/*子进程*/
pid1=getpid();
printf(“子:pid=%d”,pid);/*A*/
printf(“子:pid1=%d”,pid1);/*B*/
}
else{/*父进程*/
pid1=getpid();
printf(“父:pid=%d”,pid);/*C*/
printf(“父:pid1=%d”,pid1);/*d*/
等待(空);
}
}
我已经得到了问题的解决方案,但是我在理解fork()
函数时遇到了困难。为什么它会返回-1、0或某个正数?为什么它不能始终返回某个值?例如,当我们分配pid=fork()
时,它可以是-1、0或某个正数。即使我知道这一点,我也不知道这些价值观是如何形成的。我知道,最初,子进程会获得父数据的副本。通常,我的策略是逐行遍历代码,并在修改变量以确定输出时调整变量,但这个示例似乎不确定。我觉得我对这个问题的看法完全错误,但我不知道如何改变我的思维过程。我已经查看了fork()的文档,但没有为我澄清任何内容
此外,我们为什么不在if/else if语句中使用get函数,即pid.getID()
?这难道不意味着pid\u t
和int
是等价的吗
如能对此代码进行逐步解释,将不胜感激
作为参考,解决方案是0、2603、2603和2600。fork()
创建了一个与原始流程几乎完全相同的新流程。从返回fork()
函数开始,这两个进程都将继续运行。在父进程中,fork()
如果由于某种原因,系统无法创建新进程,fork()
在父进程而不是子进程的PID中返回-1
,并且将errno
设置为错误代码并说明失败原因
您可以使用getpid()
执行等效测试,这将需要更多的工作:
pid_t parentPID = getpid();
fork();
pid_t myPID = getpid();
if (myPID == parentPID) {
// this is the parent
} else {
// this is the child
}
在子对象中使用fork()
return0
可以简化它,因为您可以从一次调用中获得所需的所有信息,而不必调用getpid()
两次。我认为您应该阅读一些手册。例如:你正在上课,他们没有教你如何使用fork()
吗?@MikeCAT他在问题中链接了它的文档。显然,他无法从他们那里理解。那么,子进程在进程树中有叶节点吗?如果它们自己调用fork()
,则不会。除进程0之外的所有进程都是子进程。这就像人类的家族树一样。每个人都是某人的孩子,亚当和夏娃除外。因此,如果“fork()”没有自己的孩子,它将返回0,如果有孩子,它将返回正数(假设没有发生错误)?