多处理程序没有提供所需的输出

时间:2015-01-31 21:38:21

标签: c linux multiprocessing fork

我在C:

中有这个多进程程序
#include <stdio.h>
#include <unistd.h>


int main(int argc, char **argv)
{
    pid_t i = fork();
    if(i == 0)
    {
        execv("./prcs1", (char *[]){ "./prcs1", argv[1], NULL});
        _exit(1);
    }
    else if (i > 0)
    {
        execv("./prcs2", (char *[]){ "./prcs2", argv[0], NULL});
        _exit(2);
    }
    else
    {
        perror("Fork failed");
        _exit(3);
    }
}

在此程序中./prcs1./prcs2是两个不同程序的两个可执行文件。 ./prcs1将输出设为Syscall finished./prcs2提供输出Stdlibrary finished。我在每次运行中得到以下输出:

Syscall finished
Stdlibrary finished

现在,我的问题是:

  1. 上述程序是否同时运行两个进程prcs1prcs2
  2. 如果确实并行运行,那么每次都会得到相同的结果,还是我可以得到Stdlibrary finished首先出现而Syscall finished排在第二位的输出?如果这是可能的,那么为什么我在每次运行中得到相同的输出?

1 个答案:

答案 0 :(得分:2)

是的,您使用fork功能创建流程。成功fork电话后,您将在&#34; parallel&#34;中运行两个进程。

但是,你对进程调度程序没有任何影响,所以首先你不知道哪个进程是第一个运行的,除非你知道你执行的每个程序需要多长时间,否则你就不能预测每个人运行多长时间。如果所有两个外部程序(prcs1prcs2)都打印到标准输出行,则无法确定首先打印哪一行。

实际上,如果操作系统进程调度程序决定在打印过程中切换进程,则输出会变得混乱,因为两个进程输出都会相互混合。