Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 进程ID和fork()_C_Unix_Fork - Fatal编程技术网

C 进程ID和fork()

C 进程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 */

我有一个任务,要求我识别第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);
}
}
#包括
#包括
#包括
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()
return
0
可以简化它,因为您可以从一次调用中获得所需的所有信息,而不必调用
getpid()
两次。

我认为您应该阅读一些手册。例如:你正在上课,他们没有教你如何使用
fork()
吗?@MikeCAT他在问题中链接了它的文档。显然,他无法从他们那里理解。那么,子进程在进程树中有叶节点吗?如果它们自己调用
fork()
,则不会。除进程0之外的所有进程都是子进程。这就像人类的家族树一样。每个人都是某人的孩子,亚当和夏娃除外。因此,如果“fork()”没有自己的孩子,它将返回0,如果有孩子,它将返回正数(假设没有发生错误)?