Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在if语句中使用fork()_C_Fork - Fatal编程技术网

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

C 如何在if语句中使用fork(),c,fork,C,Fork,有人能给我解释一下什么是fork()!=0平均值?据我所知,我认为这意味着如果fork不是假的话?或者如果叉是真的那么。。。。我不明白Fork()如何为真或假,因为它只是将一个进程的副本创建到父进程和子进程中。另外,如果一个程序在哪里说if(Fork()==0)这意味着什么 #include "csapp.h" int main(void) { int x = 3; if (Fork() != 0) printf("x=%d\n", ++x);

有人能给我解释一下什么是
fork()!=0
平均值?据我所知,我认为这意味着如果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)
测试它是否是父进程。

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可用于稍后等待或从父pid分离。

来自fork()手册:

在代码执行之后,您有两个执行线程。在if语句中有父进程线程,在else语句中有子进程线程

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

出于澄清的目的:fork启动一个进程,该进程具有线程、内存和其他资源。我试图(似乎没有成功)通过添加“线程”一词来强调执行流程。 然而,决不能说“父进程”与“父进程”线程中的“线程”有关

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

来自

返回值

成功时,在父进程中返回子进程的PID, 并且在子级中返回0。失败时,在中返回-1 父进程,不创建子进程,并且错误号设置正确

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


好吧,我做了一件伤害性的事:我不知道csapp.h从哪里来,但如果是的话,那对你没有任何好处。我猜它在POSIX上是一个很薄的包装器(例如:around
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);

让我们试着用不同的方式来解释它。。。当函数启动时,有一个进程,这个进程有一个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)

我建议将
if
替换为
开关,因为有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;
}
#包括
#包括
pid_t pid;
开关((pid=fork()){
案例-1:/*创建子级时出错*/
打破
案例0:/*我是子进程*/
打破
默认值:/*我是父进程*/
打破
}

如果成功,并在两个(否则相同)进程中返回。。。每个进程的返回值是多少?当fork返回时,有两个进程并行运行,每个进程都有自己的
x
。。。例如,
child
在我上面的示例代码中是一个单独的变量,但是每个进程都会得到一个具有不同值的单独副本。app.h来自一本教科书,包装器的文档就在书中:。你读过一些关于
fork
的文档吗?通过谷歌搜索它,可以找到很多解释它是如何工作的,以及如何使用它的返回值。在父对象和子对象中调用
exit
是非常糟糕的做法。例如,如果进程在调用
Fork
之前缓冲了文件输出,那么当调用
exit
时,父进程和子进程都将刷新该输出。抱歉@无用,但我没有说它们不是进程:“父进程”线程是指每个进程上执行的(主/唯一)线程。这可能误导了您,但我试图强调两种执行流程。我重复了将“child's thread”更改为“child process'thread”的过程词,以改进这一点。谢谢你,没用。
#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;
}