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