1

在多个分叉进程之间共享 POSIX / Linux 中的标准错误是否有任何缓冲区限制或特定准则?

perror("Some descriptor related error: ");

我有一个服务器应用程序,它在需要时调用 perror。作为一个单一的过程,它工作正常。对于使用fork创建的多个进程,服务器运行一段时间后(发生多次打印错误),它开始连续打印错误语句并进入无限循环。

我通过注释掉服务器正常运行的打印语句来验证。

所以在我看来,标准错误可能会出现一些缓冲区溢出的情况,这种情况会在一段时间后耗尽。

我没有使用任何互斥锁或信号量来对抗 perror。

服务器代码很大,它使用 epoll 处理多个客户端描述符,其中包含一个工作进程池,这些进程池在客户端到来时获取它们。

4

1 回答 1

1

您确实需要记住,虽然 I/O 可能是线程安全的,具体取决于平台,但输出到stderr并且stdout不是多进程安全的……因此,如果您有多个进程写入终端输出,它们将结束如果没有进程间同步机制使每次写入原子性,则彼此重写。当我说“原子”时,我指的是你想写出每个进程的每条消息的整个长度......你最终可能会得到来自不同进程的每条消息的碎片作为每个人都访问终端缓冲区并以原子方式写入多个字节,但不是每个消息中的全部字节数,然后才不得不屈服于竞争终端缓冲区资源的下一个进程。

现在,您的无限循环可能是由单个进程引起的……如果您注释掉所有错误语句,您怎么知道服务器“完美”地工作?例如,如果只有一个分叉的进程死锁,那么其余进程可能都很好,并且服务器看起来“正常”运行,而实际上您只是掩盖了错误,而不是消除了它。

于 2012-07-24T15:41:15.723 回答