如何在if语句中使用fork()

有人可以向我解释一下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); } 

fork()如果失败则返回-1,如果成功,则返回父项中分叉子项的pid,子项中返回0。 所以if (fork() != 0)测试它是否是父进程。

从人叉

回报价值

成功时,子进程的PID将在父进程中返回,并在子进程中返回0。 失败时,在父项中返回-1,不创建子进程,并正确设置errno。

假设成功, fork返回两次 :一次在父级中,一次在子级中。


好吧,我对OP做了一个伤害:我不知道csapp.h来自哪里,但如果是这个,那么它不会给你任何好处。 我猜它是POSIX上的一个瘦包装器(例如fork() ),但也可以在其他平台上运行?

因为你在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); 

让我们尝试不同的解释……当函数启动时有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); 

此时输出的结果是任何人的猜测…… 你无法判断父母或孩子是否会先跑

但是如果我们假设父命中了++x是下一个操作,那么输出是:

 x=4 x=3 x=2 

因为父母和孩子都会打到--x 。 (父母的x在++ x之后是4,最后是3。孩子的x是3,最后是2)

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可能有助于稍后等待或与父母分离。

我建议用switch替换if ,因为有3种可能的结果:

 #include  #include  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; } 

从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语句中,您拥有父进程’thread和in else语句,您拥有子进程’线程。

 if ( fork() ) { printf("I am the parent!\n"); } else { printf("I am the child\n"); } 

编辑

为了澄清目的:fork启动一个进程,该进程有一个线程,内存并可能有其他资源。 我尝试(似乎没有成功)通过添加“线程”字来强调执行流程。 但是,绝不可以说“父”与“父进程’线程中的”线程“有关”。

当然,我的答案可以改进,但我认为这里已经有了足够好的答案。