This question already has answers here:
In fork() which will run first, parent or child?
(2个答案)
5年前关闭。
我有类似的代码:
由于某种原因,我无法理解,
令我感到惊讶的另一件事是,每个儿子的照片将一个接一个地打印,不可能将来自两个不同过程的两个打印同时打印到屏幕上。
示例可以在这里看到:http://ideone.com/uBYyRX
(2个答案)
5年前关闭。
我有类似的代码:
for (i = 0; i < 3; i++)
{
pid = fork();
if (pid == 0)
{
son_function();
}
if (pid < 0)
{
exit(1);
}
}
void son_function(void)
{
printf("my pid=%d\n", getpid());
printf("%d: alpha\n", getpid());
printf("%d: beta\n", getpid());
printf("%d: charlie\n", getpid());
exit(0);
}
由于某种原因,我无法理解,
son_function()
的执行顺序是相反的。我的意思是son_function()
从最大到最小打印PID
数字。令我感到惊讶的另一件事是,每个儿子的照片将一个接一个地打印,不可能将来自两个不同过程的两个打印同时打印到屏幕上。
示例可以在这里看到:http://ideone.com/uBYyRX
最佳答案
至少在Windows和Linux下,多个进程可以同时输出到控制台。
之所以会在所有其他进程之前看到一个进程,是因为您的操作系统调度线程的方式。观察此行为的更好方法是将son_function更改为类似于下面的代码,其中每个孩子的睡眠时间不同。行交错的原因(如前所述)是因为printf缓冲了输出行。
void son_function()
{
srandom(getpid());
int sleepTime = random() % 4; // random sleep between 0 and 3 seconds
printf("pid [%d] sleep time is %d\n", getpid(), sleepTime);
printf("my pid = %d\n", getpid());
sleep(sleepTime);
printf("alpha = %d\n", getpid());
sleep(sleepTime);
printf("beta = %d\n", getpid());
sleep(sleepTime);
printf("charlie = %d\n", getpid());
sleep(sleepTime);
}
07-26 05:53