2012-07-10 29 views
4

功能我只需要了解这个说法:fork()的C编程

if (fork() && !fork()) 

应该不是永远是假的呢?我的意思是,如果我写:

if (a && !a) 

它总是假的,因此首先应该永远是假的太多,我错了?我当然是,但我希望有人能向我解释这个奇怪的事情。

我学习下一个考试,我必须解决这个代码:因为它不是一个变量

int main(){ 
if(fork && !fork()){ 
    printf("a\n"); 
} 
else printf("b\n"); 
} 
+0

如果您编辑您的问题,并格式化你到代码段什么样的代码这将是很好 – mathematician1975 2012-07-10 20:00:12

+1

只有'fork'返回相同的值的两倍......(有些情况下是很好的,但要注意,返回值是不同的在创建的2个过程中)。 – geoffspear 2012-07-10 20:00:28

回答

8

每次调用到UNIX进程创建系统调用fork()的返回两次。首先,它返回父进程的子进程(调用fork()的进程)。其次它返回到0新创建的孩子。

从手册页:

返回值

成功时,子进程的PID返回父,并在孩子则返回0。失败时,在父项中返回-1,不创建子进程,并且适当地设置errno。

你的情况

if (fork() && !fork()) 

的语句中if,叉调用两次。所以会发生什么是以下几点:

A 
|----------------B 
|    | 
|---C   | 
| |   |   

现在先请fork()将在A和B都返回一个将是非零和B中也将是零。

到叉二()调用将仅由A.因为第一叉返回0至B,它不会唤起一个第二fork()诱发。 其原因是&&如果发现第一个操作数非零,则评估会短路。感谢Daniel指出了这一点。

因此,我们可以做一个表出来的这个:

PID  fork()1  fork()2 
------------------------------ 
A   >0   >0 
B   =0   >0 
C   >0   =0 
从图表

因此,处理C的if将进行评估,以TRUE

其重要要记住,没有返回fork()1到C.它得到副本已从其父母评估表达式

我希望这能解释你的问题。

+1

[我说这之前(http://stackoverflow.com/questions/11420932/fork-function-in-c-programming#comment15064848_11421071):只会有三个过程,第一个孩子不'叉()因为'&&'捷径。 – 2012-07-10 20:50:40

+0

感谢您的评论。我忽略了它。我在编辑我的答案以反映它。 – Aftnix 2012-07-10 20:53:02

+0

好。一旦你修好了,这是一个很好的解释。 – 2012-07-10 20:58:14

3
shouldn't be always false? 

,每次调用fork()创建一个新的子处理。

+0

那么if(fork()&&!fork())的含义是什么? – gyosko 2012-07-10 20:03:03

+0

它在子代中返回0,在其父代中返回pid(不是0)。 – fork0 2012-07-10 20:03:34

+0

在父母的第二个孩子身上做些事情。你真的更好地发布整个代码。 – fork0 2012-07-10 20:04:05

1

fork()每次调用返回两个值,一个用于各处理。因此,对于每个决策,都有一个过程采用每条路径。

6

首先,是一个函数。它可能并不总是返回相同的值。

在这种情况下具体地,叉是创建另一个进程的功能。原来的工艺获得了正收益值(孩子的PID)和子进程获得0

返回值在你的代码中,最终成为一共有三个过程。 if语句将对其中的1个进行评估(下面的流程C)。

 A 
    |__________B 
    |   | 
    |__C  | 
    | |  |  
    | |  |   
+3

将只有三个过程,第一个孩子不'fork()的''因为'&&捷径。 – 2012-07-10 20:10:42

+0

好点。固定。 – sshannin 2012-07-10 20:18:09

+0

我怎么能知道哪个处理if语句会是真的吗?@DanielFischer – gyosko 2012-07-12 16:46:41

0

fork()函数调用返回0到子进程和进程ID给父进程。基本上,这只是分叉一次。如果进程是父进程,则跳转到下一个块,然后子进程再次分叉。这一进程的父跳转到下一个块,并在此块中的孩子执行在if语句的代码。