为什么`fork()`调用没有在无限循环中优化掉?

时间:2015-03-27 07:30:39

标签: c++ c++11 fork posix

考虑

C ++11§1.10/ 24([intro.multithread])
  

实现可能会假设任何线程最终会执行以下操作之一:
   - 终止,
   - 调用库I / O功能,
   - 访问或修改易失性对象,或
   - 执行同步操作或原子操作   [注意:这是为了允许编译器转换,例如删除空循环,即使在   终止无法证明。 - 后注]

...允许编译器优化掉以下循环:

int main(int argc, char* argv[]) {
    while ( true )
        fork();
}

(在(Optimizing away a "while(1);" in C++0x)有一些早期的讨论,但它似乎没有回答循环中fork调用的情况。)

1 个答案:

答案 0 :(得分:10)

fork是一个普通函数,就像调用glibc fork()包装器而不是直接调用系统调用的其他库函数一样。

编译器无法确定此函数包含的内容,并且符合条件的编译器应始终避免优化此循环,这将导致其中一条注释中引用fork bomb

为了避免后果,应该避免用户拥有的最大进程数。

来自man fork

  

从版本2.3.3开始,而不是调用内核的fork()系统调用,作为一部分提供的glibc fork()包装器   NPTL线程实现调用带有标志的clone(2)   提供与传统系统调用相同的效果。 glibc包装器调用已建立的任何fork处理程序   使用pthread_atfork(3)。