有人可以向我解释fork() != 0
的含义吗?根据我的理解,我认为这意味着fork是不是假的?或者如果fork是真的那么....我不明白Fork()如何是真或假,看到它只是创建一个进程的副本到父和子。如果一个程序在哪里说if (Fork() == 0)
这意味着什么?
#include "csapp.h"
int main(void)
{
int x = 3;
if (Fork() != 0)
printf("x=%d\n", ++x);
printf("x=%d\n", --x);
exit(0);
}
答案 0 :(得分:4)
fork()
如果失败则返回-1,如果成功,则返回父项中分叉子项的pid,子项中返回0。所以if (fork() != 0)
测试它是否是父进程。
答案 1 :(得分:3)
来自man fork
返回值
成功时,子进程的PID在父进程中返回, 在孩子身上返回0。失败时,返回-1 parent,没有创建子进程,并且正确设置了errno。
假设成功,fork
会返回两次:一次在父级,一次在子级。
好吧,我对OP做了一个伤害:我不知道csapp.h
来自哪里,但如果它是this one那么它对你没有好处。我猜它是POSIX上的一个瘦包装器(例如fork()
左右),但也可以在其他平台上运行?
因为你在fork()
之前提到Fork()
,我认为后者是一个拼写错误,而它实际上是一个库函数。
如果您直接使用fork()
,那么期望您查看联机帮助页是合理的。
由于您正在使用某个库提供的Fork()
函数,因此该库实际上应该记录它,并且似乎不会。
标准(非 csapp )用法是:
pid_t child = fork();
if (child == -1) {
printf("fork failed - %d - %s\n", errno, strerror(errno));
exit(-1);
}
if (child) {
printf("I have a child with pid %d, so I must be the parent!\n", child);
} else {
printf("I don't have a child ... so I must be the child!\n")
}
exit(0);
答案 2 :(得分:2)
来自fork()手册:
Upon successful completion, fork() returns a value of 0 to the child process and returns the process ID of the child process to the parent
process. Otherwise, a value of -1 is returned to the parent process, no child process is created, and the global variable errno is set to indi-
cate the error.
代码执行后,您有两个执行线程。在if语句中,您拥有父进程的线程,而在else语句中,您拥有子进程'线程。
if ( fork() ) {
printf("I am the parent!\n");
} else {
printf("I am the child\n");
}
修改
为了澄清目的:fork启动一个进程,该进程有一个线程,内存并可能有其他资源。我尝试(似乎没有成功)通过添加“线程”字来强调执行流程。 但是,绝不可以说“父”与“父进程'线程中的”线程“有关。”
当然,我的答案可以改进,但我认为这里已经有了很多好的答案。
答案 3 :(得分:2)
让我们试着用不同的方式解释它...当函数启动时有1个进程,这个进程有一个int x = 3
一旦你点击这行代码:
if (fork() != 0)
现在,假设fork()工作,我们有两个进程。它们都具有相同的执行空间,它们都将运行相同的代码(到一个点),但是孩子将获得自己的x
副本来玩。
fork()会向子进程返回0,所以从子进程的预期来看,函数的其余部分是这样的:
printf(("x=%d\n", --x);
exit(0);
另一方面,父进程将从fork()命令返回一个有效值,因此它将执行:
printf("x=%d\n", ++x);
printf("x=%d\n", --x);
exit(0);
此时的输出是任何人的猜测...... You can't tell if parent or child will run first
但是如果我们假设父命中++x
是下一个操作,那么输出是:
x=4
x=3
x=2
父母和孩子都会遇到--x
。 (父母的x在++ x之后是4,最后是3。孩子的x是3,最后是2)
答案 4 :(得分:1)
Fork为子进程返回0,将子进程的进程id返回给父进程。因此,通常代码具有if(fork){} else代码。这意味着if中的代码将仅在父代中执行。
处理它的更好方法是
pid = fork()
if(pid){
// I am parent. Let us do something that only the parent has to do
}else{
// I am child. Let us do something only the child has to do
}
// This code is common to both
儿童pid可能有助于稍后等待或与父母分离。
答案 5 :(得分:1)
我建议将if
替换为switch
,因为有3种可能的结果:
#include <sys/types.h>
#include <unistd.h>
pid_t pid;
switch ((pid = fork ())) {
case -1: /* error creating child. */
break;
case 0: /* I am the child process. */
break;
default: /* I am the parent process. */
break;
}