a.k.a 《在 C 程序中禁用管道中 stdout 的流缓冲》

注意,本文中代码使用了 C99 特性,如声明 for 循环控制变量和 VLA 数组;同时使用了 GNU 的扩展。请使用 -std=c99 -D_GNU_SOURCE 编译。

最近,盖子正在重写服务器上的 php-loop 工具。这个工具的作用的不断重复运行一个程序。叫 php 的原因,是因为最初(也是现在)的需求是用来不停地运行 php-cgi,防止它死掉导致服务中断。

由于时常有人通知盖子虚拟主机上的 php-cgi 出错,因此日志是十分重要的。然而,php-cgi 打印的日志没有时间戳,因此,盖子的 php-loop 必须能够对 php-cgi 的输出做一点处理。

这种需求一点也不新鲜,思路自然从这里开始 —— fork() 出一个子进程去处理一些事情,并把随时把进展通过管道告知父进程。

然而,将这种方法扩展到 execvp 后,却发现由于 stdout 的流缓冲,无法及时获得输出信息。

Continue reading