在子进程中将 dev/null 设置为标准有什么意义

问题描述

我在一个应用程序中看到了这段代码

 int dev_null_fd = open("/dev/null","w");
 child_pid = fork()
 if (!child_pid) {
     dup2(dev_null_fd,0);
     dup2(dev_null_fd,1);   
     dup2(dev_null_fd,2);
 }

这段代码的意图是什么?它是否试图从子进程中丢弃 stdin、stdout 和 stderr,以便消息不会混合(污染)。

但是,来自子进程的消息仍然显示在外壳上。

这是怎么回事?

谢谢!

解决方法

这相当于在 shell 中完成的 < /dev/null >/dev/null 2>&1

它会导致文件描述符 012 上的读/写和其他文件描述符操作在不返回错误的情况下不执行任何操作,并防止将来的文件描述符分配操作({ {1}}、openpipe、...) 使用文件描述符 socket01,只要它们保持打开状态.