首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >进程ID和fork()

进程ID和fork()
EN

Stack Overflow用户
提问于 2015-09-25 09:49:07
回答 1查看 2.9K关注 0票数 2

我有一个任务,要求我标识A、B、C和D行的进程is的值,假设父进程和子进程的实际pids分别为2600和2603。

代码语言:javascript
运行
复制
#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_tint是等价的吗?

如果您能一步一步地解释这段代码,我们将不胜感激。

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

EN

回答 1

Stack Overflow用户

发布于 2015-09-25 09:53:13

fork()创建了一个与原始进程几乎完全相同的新进程。从返回fork()函数开始,这两个进程都会继续运行。在父进程中,fork()返回子进程的PID (一个正数),而在子进程中,fork()返回0 (这就是它知道自己是子进程的原因)。

如果由于某种原因,系统无法创建新进程,fork()将在父进程中返回-1,而不是子进程的PID,并将errno设置为错误代码以及失败的原因。

你可以用getpid()做一个等价的测试,这只会有更多的工作:

代码语言:javascript
运行
复制
pid_t parentPID = getpid();
fork();
pid_t myPID = getpid();
if (myPID == parentPID) {
    // this is the parent
} else {
    // this is the child
}

在子级中使用fork()返回0可以简化这一过程,因为您可以从一次调用中获得所需的所有信息,而不必调用getpid()两次。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32773545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档