#include <stdio.h>
#include <unistd.h>
int main() {
int a=0;
int rc=fork();
a++;
if(rc=0)
{
rc=fork();
a++;
}
else
{
a++;
}
printf("Hello World");
printf("%d",a);
return 0;
}
答案 0 :(得分:1)
int a=0; //a=0
int rc=fork();
a++;//a=1
printf("A before the if else");
printf("%d",a);// a=1
if(rc==0)// this was rc=0 it should have been rc==0
{
rc=fork();
a++;//a=2
printf("A inside the if");
printf("%d",a);// a=2
}
else
{
a++;//a=2
printf("A inside the else");
printf("%d",a);// a=2
}
printf("Hello World");// "Hello World"
printf("%d",a);// a=2
return 0;// always returns 0
为什么它两次打印Hello world的原因我不能从给出的代码中说出来,但是您必须两次调用main。如果您的语言有能力,我会使用堆栈trace()(不是c开发人员)
答案 1 :(得分:1)
hello world为什么只打印两次,为什么a的最大值是2
要回答您的问题(在更正(rc = 0)
与(rc == 0)
问题之后),它可能有助于图解代码中正在发生的事情。例如:
parent
|
a = 1
if (rc == 0)
+--------------- child 1
| |
else +--------------- child 2
a++ a++ a++
a = 2 a = 2 a = 2
Hello World2 Hello World2 Hello World2
在父进程中,您fork
然后在测试a
之前将a++
用if (rc == 0)
递增a++
,以指导子进程。由于else
,原始父级再次看到"Hello World2"
,而结果是a++;
。
在第一个孩子中,您再次进行分叉,但是孩子1(作为父母)和孩子2都递增"Hello World2"
,然后退出带有#include <stdio.h>
#include <unistd.h>
int main (void) {
int a = 1,
rc = fork();
if (rc == 0) {
a++;
rc = fork();
if (rc == 0)
a++;
}
printf ("Hello World %d\n", a);
}
的条件结果。
似乎您正在尝试类似的操作:
$ ./bin/forkcount
Hello World 1
Hello World 2
Hello World 3
使用/输出示例
class a
{
public:
a(int c) : b([=]() -> int {
if (c < MIN_ALLOWED || c > MAX_ALLOWED)
throw std::logic_error("b");
return c;
}()) {}
private:
int b;
有时候铅笔和纸和键盘一样有用。如果您还有其他问题,请告诉我。