因为 LINUX 主机的进程组策略,完全严格的 Daemon 进程无法写终端。
当一个进程既不是它自身的父进程,同时它也不是组长进程的时候,它就是严格的的 daemon 进程。
mini_httpd 本身并不是严格的 daemon 进程。它是一个组长进程。
但是 mini_httpd 调用的 cgi 进程,就不是组长进程,它是 mini_httpd 进程组中的一个进程。
所以 cgi 在获取终端 fd 的时候会失败,内核会发送一个信号。如果不对信号进行处理的话,默认情况下进程将结束。
在具体的是实现细节上:
mini_httpd 使用 select->accept->fork 模型。
在子进程中 handle HTTP 请求(TCP socket),子进程进行必要的处理之后,将 STDOUT,STDIN 做了 dup2 修改(具体绑定到 socket 上还是 pipe 上我没有仔细研究)。因此继续往下运行,再调用 exec 系的函数,切换执行 cgi 程序,cgi 程序的标准输出即等同于 TCP socket 的 payload,即输出就是 HTTP 整个协议头+正文内容。
所以 cgi 程序也不能通过直接输出到终端的方式来 debug。
Reference: AUPE