在多个分叉进程中,POSIX / Linux中是否存在共享标准错误的缓冲区限制或特定指南?
perror("Some descriptor related error: ");
我有一个服务器应用程序,在需要时调用perror。作为一个单一的过程,它工作正常。如果使用fork创建多个进程,在运行服务器一段时间后(发生错误多次打印时),它会开始连续打印错误语句并进入无限循环。
我通过注释掉服务器正常运行的print语句来验证。
所以在我看来,标准错误可能会出现一些缓冲区溢出的情况,一段时间后会耗尽。
我没有使用任何互斥锁或信号量来反对perror。
服务器代码很大,它使用epoll来处理多个客户端描述符,其中包含一个工作进程池,可以在客户端进入时接收客户端。
答案 0 :(得分:1)
您需要记住,虽然I / O可能是线程安全的,具体取决于平台,但stderr
和stdout
的输出不是多进程安全 ...因此,如果您有多个进程写入终端输出,如果没有进程间同步机制使每个写入原子,它们将最终相互写入。当我说“原子”时,我指的是你想要写出每个进程的每个消息的整个长度...你可能最终得到的是每个消息的碎片从不同的进程一起被粉碎每个访问终端缓冲区并原子地写入多个字节,但不是每个消息中的整个字节数,然后必须屈服于争用终端缓冲区资源的下一个进程。
现在,您的无限循环可能是由单个进程引起的...如果您注释掉所有错误语句,您怎么知道服务器“完美”工作?例如,如果只有一个分叉进程死锁,其余的进程可能没问题,服务器似乎“正常”运行,实际上你只是掩盖了这个bug,而不是消除它。