C中分叉的输出
Output of Forking in C
给定 PID = 4224
为什么我得到以下代码片段的输出:
x = 10922 y = 0
我是进程:10923
x = 0 y = 2
我是进程:10922
x = 0 y = 2
我是进程:10922
x = 0 y = 0
我是进程:10924
对于此代码:
#include <iostream>
#include <stdio.h>
#include <unistd.h>
int main() {
int x = 1, y = 2;
int pid;
x=fork();
if(x==0){
printf("x = %d y = %d\n", x, y);
pid = getpid();
printf("I am process: %d\n", pid);
}
y = fork();
if(y==0){
printf("x = %d y = %d\n", x, y);
pid = getpid();
printf("I am process: %d\n", pid);
}
return 0;
}
让我们从这个开始,程序的输出:
x = 0 y = 2
I am process: 330161
x = 330161 y = 0
I am process: 330162
x = 0 y = 0
I am process: 330163
请注意,顺序与您的略有不同。这是因为哪个进程先运行取决于环境。因此,让我们稍微修改一下您的程序,使其更加清晰:
#include <stdio.h>
#include <unistd.h>
int main() {
int x = 1, y = 2;
int pid;
x=fork();
if(x==0){
pid = getpid();
printf("1:x = %d y = %d I am process %d\n", x, y, pid);
}
fflush(NULL);
y = fork();
if(y==0){
pid = getpid();
printf("2:x = %d y = %d I am process %d\n", x, y, pid);
}
return 0;
}
通过将printfs 和一个换行符放在一起,我们可以放心每条语句属于一个进程,它们不会交错。
通过在 1:, 2:
行的开头添加一个指示符,我们知道它们来自哪个 printf() 。 fflush() 阻止 child 进程从 stdio 继承任何部分缓冲的写入——如果您在终端上,这不是问题,但如果您重定向到一个文件,您可能会发现重复的行。所以我系统上的输出看起来像:
1:x = 0 y = 2 I am process 330214
2:x = 330214 y = 0 I am process 330215
2:x = 0 y = 0 I am process 330216
据此,主进程的第一个child进程是330214。第二个是330215; grand-child(child 的 child)是 330216。
我希望这能给你足够的答案。
不要害怕使用这些示例程序。这是了解系统工作原理的好方法。
给定 PID = 4224 为什么我得到以下代码片段的输出:
x = 10922 y = 0 我是进程:10923 x = 0 y = 2 我是进程:10922 x = 0 y = 2 我是进程:10922 x = 0 y = 0 我是进程:10924
对于此代码:
#include <iostream>
#include <stdio.h>
#include <unistd.h>
int main() {
int x = 1, y = 2;
int pid;
x=fork();
if(x==0){
printf("x = %d y = %d\n", x, y);
pid = getpid();
printf("I am process: %d\n", pid);
}
y = fork();
if(y==0){
printf("x = %d y = %d\n", x, y);
pid = getpid();
printf("I am process: %d\n", pid);
}
return 0;
}
让我们从这个开始,程序的输出:
x = 0 y = 2
I am process: 330161
x = 330161 y = 0
I am process: 330162
x = 0 y = 0
I am process: 330163
请注意,顺序与您的略有不同。这是因为哪个进程先运行取决于环境。因此,让我们稍微修改一下您的程序,使其更加清晰:
#include <stdio.h>
#include <unistd.h>
int main() {
int x = 1, y = 2;
int pid;
x=fork();
if(x==0){
pid = getpid();
printf("1:x = %d y = %d I am process %d\n", x, y, pid);
}
fflush(NULL);
y = fork();
if(y==0){
pid = getpid();
printf("2:x = %d y = %d I am process %d\n", x, y, pid);
}
return 0;
}
通过将printfs 和一个换行符放在一起,我们可以放心每条语句属于一个进程,它们不会交错。
通过在 1:, 2:
行的开头添加一个指示符,我们知道它们来自哪个 printf() 。 fflush() 阻止 child 进程从 stdio 继承任何部分缓冲的写入——如果您在终端上,这不是问题,但如果您重定向到一个文件,您可能会发现重复的行。所以我系统上的输出看起来像:
1:x = 0 y = 2 I am process 330214
2:x = 330214 y = 0 I am process 330215
2:x = 0 y = 0 I am process 330216
据此,主进程的第一个child进程是330214。第二个是330215; grand-child(child 的 child)是 330216。 我希望这能给你足够的答案。
不要害怕使用这些示例程序。这是了解系统工作原理的好方法。