2014-12-06 57 views
0

执行我有一个类似的代码:`叉()`儿子以相反的顺序

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

+0

'getpid()'返回调用进程的进程ID。你不应该期望_variable_'pid'和函数'getpid()'之间有任何关联。 – ryyker 2014-12-06 01:33:41

+0

@ryyke,我不是在寻找关联,我正在寻找执行顺序中的某种意义。为什么最先打印出'PID'最高的儿子? – Quaker 2014-12-06 01:35:26

+1

使用_pid_数组,即'pid_t pid [3];'。然后通过查看唯一元素(pid [0],...)来追踪它们。 – ryyker 2014-12-06 01:40:04

回答

1

多个进程可以输出到控制台的同时,至少在Linux和Windows。

之所以你能看到所有其中一个进程是由于你的特定OS调度线程的方式。查看此行为的更好方法是将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); 
} 
+0

那么为什么打印中没有碰撞到控制台?为什么儿童1正在以其正确的顺序打印,而他的照片之间没有其他任何儿童(即儿童2)打印? – Quaker 2014-12-06 09:34:05

0

要以正确的顺序执行子进程,只需在调用fork函数之前在循环内添加wait函数即可。

所以它会等到孩子终止并且子进程将按正确的顺序终止。

 for (i = 0; i < 3; i++) 

      wait(); 
      pid = fork(); 

添加等待函数后执行代码。