fork 到底返回什么?
- 2024-11-01 08:41:00
- admin 原创
- 60
问题描述:
如果成功,则在父进程的执行线程中返回子进程的 PID,在子进程的执行线程中返回 0。
p = fork();
我对它的手册页感到困惑,p
等于0
或PID
?
解决方案 1:
我不知道手册怎么能更清楚! fork()
创建一个新进程,所以现在有两个相同的进程。为了区分它们,返回值fork()
不同。在原始进程中,您获得子进程的 PID。在子进程中,您获得 0。
因此规范用法如下:
p = fork();
if (0 == p)
{
// We're the child process
}
else if (p > 0)
{
// We're the parent process
}
else
{
// We're the parent process, but child couldn't be created
}
解决方案 2:
p = fork();
/* 假设没有错误 */
/* 你现在有两个 */
/* 程序正在运行 */
--------------------
如果 (p > 0) { | 如果 (p == 0) {
printf("父级
"); | printf("子级
");
... | ...
解决方案 3:
进程以有向树的形式构建,您只知道单亲进程 ( getppid()
)。简而言之,与许多其他系统函数一样,在发生错误时fork()
返回-1
非零值,这对于 fork 调用的发起者(父进程)了解其新子进程的 pid 很有用。
没有什么比例子更好了:
/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h> /* fork(), getpid() */
#include <stdio.h>
int main(int argc, char* argv[])
{
int pid;
printf("Entry point: my pid is %d, parent pid is %d
",
getpid(), getppid());
pid = fork();
if (pid == 0) {
printf("Child: my pid is %d, parent pid is %d
",
getpid(), getppid());
}
else if (pid > 0) {
printf("Parent: my pid is %d, parent pid is %d, my child pid is %d
",
getpid(), getppid(), pid);
}
else {
printf("Parent: oops! can not create a child (my pid is %d)
",
getpid());
}
return 0;
}
结果(在本例中,bash 是 pid 2249):
Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051
如果您需要在父进程和子进程之间共享一些资源(文件、父进程 pid 等),请查看clone()
(针对 GNU C 库,可能还有其他库)
解决方案 4:
一旦fork
执行,您就会有两个进程。调用会向每个进程返回不同的值。
如果你做这样的事情
int f;
f = fork();
if (f == 0) {
printf("I am the child
");
} else {
printf("I am the parent and the childs pid is %d
",f);
}
您将看到打印的两条消息。它们由两个单独的进程打印。这就是您可以区分创建的两个进程的方式。
解决方案 5:
这才是最酷的部分。它等于 BOTH。
嗯,其实不是。但是一旦fork
返回,您现在就有两个程序副本在运行!两个进程。您可以把它们看作是平行宇宙。在一个宇宙中,返回值是0
。在另一个宇宙中,它是ID
新进程的!
通常你会得到如下结果:
p = fork();
if (p == 0){
printf("I am a child process!
");
//Do child things
}
else {
printf("I am the parent process! Child is number %d
", p);
//Do parenty things
}
在这种情况下,两个字符串都会被打印,但是通过不同的过程!
解决方案 6:
fork()
在父进程中调用。然后生成一个子进程。当子进程生成时,fork()
它已经完成执行。
此时,fork()
已准备好返回,但根据是在父进程还是子进程中,它返回不同的值。在子进程中,它返回 0,而在父进程/线程中,它返回子进程的进程 ID。
解决方案 7:
Fork 会创建一个重复的进程和一个新的进程上下文。当它返回 0 值时,表示子进程正在运行,但当它返回另一个值时,表示父进程正在运行。我们通常使用 wait 语句,以便子进程完成并开始执行父进程。
解决方案 8:
我认为它的工作原理是这样的:当 pid = fork() 时,代码应该执行两次,一次在当前进程中,一次在子进程中。所以它解释了为什么 if/else 都执行。顺序是,首先执行当前进程,然后执行子进程。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件