fork(),始终先运行 parent,然后运行 child
fork(), runs always the parent first and then the child
我正在了解 fork()
,但我的 ubuntu 出现了问题。我 运行正在使用此代码:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
printf("--beginning of program\n");
int counter = 0;
pid_t pid = fork();
if (pid == 0)
{
// child process
int i = 0;
for (; i < 5; ++i)
{
printf("child process: counter=%d\n", ++counter);
}
}
else if (pid > 0)
{
// parent process
int j = 0;
for (; j < 5; ++j)
{
printf("parent process: counter=%d\n", ++counter);
}
}
else
{
// fork failed
printf("fork() failed!\n");
return 1;
}
printf("--end of program--\n");
return 0;
}
我知道 parent 和 child 应该 运行 他们的代码没有特定的顺序所以代码应该 return 像这样:
-beginning of program
parent process: counter=1
parent process: counter=2
parent process: counter=3
child process: counter=1
parent process: counter=4
child process: counter=2
parent process: counter=5
child process: counter=3
child process: counter=4
child process: counter=5
--end of program--
但每次我 运行 程序时,它们 运行 的顺序似乎都是一样的。这是我每次 运行 这个程序时得到的捕获:
user@user-VirtualBox:~/Documents/S-O$ ./sample
--beginning of program
parent process: counter=1
parent process: counter=2
parent process: counter=3
parent process: counter=4
parent process: counter=5
--end of program--
user@user-VirtualBox:~/Documents/S-O$
child process: counter=1
child process: counter=2
child process: counter=3
child process: counter=4
child process: counter=5
--end of program--
似乎 parent 先完成,然后 child 开始。但我想那不是真的。请注意,第二个 shell 提示由程序本身打开。对可能发生的事情有什么想法吗?
编辑:
如果我放一个 sleep(1)
它工作得很好。我仍然认为,毫不拖延,它不应该总是有相同的执行顺序。即使数到 100,它也会给出同样的结果
是 parent 和 children 运行 他们的代码以几乎不可预测的顺序排列(记住没有 运行domness),但你的调度程序可能会选择,分叉后,先安排parent,然后安排child。由于两者都有一个非常小的代码,parent 能够 运行 它的所有代码,然后是 children。要试验其他东西,您必须在两个进程中分叉后做更长时间的事情(例如,您将能够看到不同的输出交错)。
提示不是由您的代码产生的,而是它的结果。当 parent 进程终止时, shell 即 运行 它会重新获得控制权并提示您输入另一个命令,而与此同时 children 正在工作并污染您的终端。 child 已成为孤儿进程。为防止这种情况,您必须通过调用...wait()
.
告诉 parent 等待它的 child
我正在了解 fork()
,但我的 ubuntu 出现了问题。我 运行正在使用此代码:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
printf("--beginning of program\n");
int counter = 0;
pid_t pid = fork();
if (pid == 0)
{
// child process
int i = 0;
for (; i < 5; ++i)
{
printf("child process: counter=%d\n", ++counter);
}
}
else if (pid > 0)
{
// parent process
int j = 0;
for (; j < 5; ++j)
{
printf("parent process: counter=%d\n", ++counter);
}
}
else
{
// fork failed
printf("fork() failed!\n");
return 1;
}
printf("--end of program--\n");
return 0;
}
我知道 parent 和 child 应该 运行 他们的代码没有特定的顺序所以代码应该 return 像这样:
-beginning of program
parent process: counter=1
parent process: counter=2
parent process: counter=3
child process: counter=1
parent process: counter=4
child process: counter=2
parent process: counter=5
child process: counter=3
child process: counter=4
child process: counter=5
--end of program--
但每次我 运行 程序时,它们 运行 的顺序似乎都是一样的。这是我每次 运行 这个程序时得到的捕获:
user@user-VirtualBox:~/Documents/S-O$ ./sample
--beginning of program
parent process: counter=1
parent process: counter=2
parent process: counter=3
parent process: counter=4
parent process: counter=5
--end of program--
user@user-VirtualBox:~/Documents/S-O$
child process: counter=1
child process: counter=2
child process: counter=3
child process: counter=4
child process: counter=5
--end of program--
似乎 parent 先完成,然后 child 开始。但我想那不是真的。请注意,第二个 shell 提示由程序本身打开。对可能发生的事情有什么想法吗?
编辑:
如果我放一个 sleep(1)
它工作得很好。我仍然认为,毫不拖延,它不应该总是有相同的执行顺序。即使数到 100,它也会给出同样的结果
是 parent 和 children 运行 他们的代码以几乎不可预测的顺序排列(记住没有 运行domness),但你的调度程序可能会选择,分叉后,先安排parent,然后安排child。由于两者都有一个非常小的代码,parent 能够 运行 它的所有代码,然后是 children。要试验其他东西,您必须在两个进程中分叉后做更长时间的事情(例如,您将能够看到不同的输出交错)。
提示不是由您的代码产生的,而是它的结果。当 parent 进程终止时, shell 即 运行 它会重新获得控制权并提示您输入另一个命令,而与此同时 children 正在工作并污染您的终端。 child 已成为孤儿进程。为防止这种情况,您必须通过调用...wait()
.