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

时间:2012-09-14 19:01:45

标签: c 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);
 }

6 个答案:

答案 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;
}