理解分叉 - 简单

时间:2014-11-16 08:02:29

标签: c multiprocessing fork

如果我有这样的程序:

int i = 0;
int status;
bool result = true;

    for(i = 0; i < numfiles; i++) { // LOOP 1
        if (fork() == 0) {/* Child */
            if (substLines(s1, s2, filenames[i])) {
                exit(0);
            } else {
                exit(2);
            }
        }
    }
    for(i = 0; i < numfiles; i++) { // LOOP 2
        wait(&status);
        ....
    }

    return result;
}

我有以下问题。

  1. 如果子进程存在,在程序甚至知道wait()之前会发生什么。我想我的问题是关于程序是如何“阅读”的。例如,再一次。如果我退出第一个孩子,同时仍然经历LOOP 1,会发生什么(此时甚至知道LOOP 2)?
  2. 这是一个并发程序吗?父母似乎在等孩子们等待他们全部,所以我会说是的?

2 个答案:

答案 0 :(得分:2)

man page of wait

  

如果孩子已经改变了状态,那么这些呼叫会立即返回。否则它们会阻塞,直到子项改变状态或信号处理程序中断调用

所以问题1并不重要

和问题2,答案是否定的。

并发意味着它们同时运行。它需要多核CPU或多台计算机,如分布式系统。

你的程序是多进程的,它只是Parallelism,这意味着它们在CPU的时间表下逐个运行,以获取更多信息:Scheduling_(computing)

答案 1 :(得分:0)

只是@ simon_xia的优秀答案的补充。

被杀或退出的进程变为zombie,直到其父进程为其调用wait。是的,这是官方术语。 :-)在僵尸状态下,一切都被清理(内存页面,打开文件,环境等),只保留退出状态或查杀信号编号。