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 的流缓冲,无法及时获得输出信息。