【问题标题】:Creating more than one process using fork使用 fork 创建多个进程
【发布时间】:2014-07-20 12:00:54
【问题描述】:

在与我的朋友激烈讨论后,我们决定问问我们的直觉是否走在正确的道路上。问题在于 fork() 函数,或者更确切地说是子进程。 代码如下:

int main()
{
    int status;
    if(!fork()) execl("pp1",NULL);
    if(!fork()) execl("pp2",NULL);
    if(!fork()) execl("pp3",NULL);
    wait(&status);
    return status;
}

作者解释说这个程序将只创建3个子进程,但是当涉及到第一个子进程时,它会进入第一个“if”并执行pp1作为一个新进程但与子进程具有相同的pid,没关系。问题在于第二个和第三个孩子,它将如何运行此代码。我们的直觉是,我们不会遇到第二个和第三个“如果”。程序 pp1 将由所有 3 个子进程运行 3 次。

你怎么看?结果会怎样?

【问题讨论】:

  • 测试自己会这么难吗?
  • 别忘了exec,朋友也可能失败。如果他们这样做了,那么子进程将直接进入下一个if
  • 你能重写它,使它不等待未初始化的变量吗?

标签: c linux unix fork createprocess


【解决方案1】:

注意fork() 的返回值。来自man 2 fork

成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并适当设置 errno 很快。

意思是子进程在fork成功后收到0。当!0 计算为true 时,孩子执行execl,而父亲则前进到下一个fork()

【讨论】:

    【解决方案2】:

    此代码将执行 pp1,然后是 pp2,最后是 pp3。好的。但是验证 execl 的返回值也可能是一个好主意。如果失败,它不会退出(是的,exec 函数退出正在运行的进程)。

    但我不知道你想做什么。但是要从 C 程序启动二进制文件(即使你只是想获得这个程序的返回值),它可以(我说“可以”;))更好地使用 'system()' 函数。它返回传入参数的程序的值,并且在执行后不会退出程序,这与 exec 函数不同。

    我只是提供另一种解决方案。我不是在批评那个;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2017-02-25
      • 2021-07-09
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多