if(!fork())
是什么意思?我对它有点困惑,我不知道我什么时候在父母和孩子的过程中:
if(!fork())
{
// is it child or parent process?
}else{
// is it child or parent process?
}
答案 0 :(得分:8)
返回值
成功时,子进程的PID在父进程中返回, 在孩子身上返回0。失败时,返回-1 parent,没有创建子进程,并且正确设置了errno。
由于fork()
向子节点返回0,所以if子句测试它是否是子节点:
if (!fork()) // same as: if (fork() == 0)
{
// child
}else{
// parent
}
答案 1 :(得分:2)
因为0
可以在条件中使用,就像它是布尔值一样,这与询问相同:
if(fork() == 0) {
文档说:
成功时,子进程的PID在父进程中返回, 在孩子身上返回0。失败时,返回-1 parent,没有创建子进程,并且正确设置了errno。
当编码器只关心“不0
”或0
(“真”或“假”)时,直接在条件中使用整数值是一种常见的习语。
答案 2 :(得分:2)
对fork
的调用在子节点中返回0(当然,如果它有效),所以if
语句的真(第一)部分在那里运行(因为!0
为真)。
false(第二)部分在父项中执行,无论fork
成功(返回子项的PID)还是失败(返回-1
)。
我不是这个特定方法的忠实粉丝,因为它没有考虑到所有边缘情况。我更喜欢这样的东西:
pid_t pid = fork();
switch (pid) {
case -1: {
// I am the parent, there is no child, see errno for detail.
break;
}
case 0: {
// I am the child.
break;
}
default: {
// I am the parent, child PID is in pid, eg, for waitpid().
break;
}
}
通过该设置,您知道完全正在发生什么,没有信息丢失。
答案 3 :(得分:1)
if(!fork())
{
/* its child, as child would only be created on success and return 0 which would have been turned into true by ! operator */
}else{
/* it is parent because either success or failed, fork would have returned nonzero value and ! would have made it false */
}
if(!fork())
{
/* its child, as child would only be created on success and return 0 which would have been turned into true by ! operator */
}else{
/* it is parent because either success or failed, fork would have returned nonzero value and ! would have made it false */
}
答案 4 :(得分:1)
该代码不会检查fork的错误!当已经有太多进程在运行时,或者没有足够的内存时,fork将会失败,并且您的软件可能会以非常奇怪的方式运行。
答案 5 :(得分:0)
执行man fork
,您将了解更多信息。
它实际上返回pid_t
,实际上是int
成功返回后,它会为子进程提供0
,为父进程提供正值
实际上是这样的:
pid_t pid;
pid=fork();
if(pid <0)
{
printf("fork failed");
return -1;
}
else if(pid == 0)
{
it is child process
}
else
{
It is parent process
}
所以当你执行if(!fork())
时,它意味着child process
,因为!0 == 1
,即如果条件为真,它将执行if(!fork())
答案 6 :(得分:0)
fork()
的值可以是:
0,这意味着它是一个孩子
&LT; 0,这是一个错误
&GT; 0父母,这意味着它是父母
由于if (!fork())
只是撰写if (fork() == 0)
的简短方法,因此意味着:
if(!fork()) {
// it is a child process
}
else {
// it is a parent process
}