我编写了一个应用程序,它使用 fork 和 execv 来启动另一个进程。我制作了一个用于通知状态的管道,并从已启动进程的主条目中写入一些字节以通知它已正确启动。否则,read 返回 0,因为写入管道已在分叉进程中关闭。
唯一的麻烦是当进程没有启动(没有库)时,我在 stderr 中收到一条关于此的消息。消息被写入 shell 出了什么问题。我宁愿安静地做。但是,如果我在 execv 之前执行 close(2) ,我就没有我想要的消息。我仍然想保持 fd 2 对 stderr 开放。
大概应用程序根本不喜欢没有标准错误流。而不是
close(2);
我会尝试
int tmpfd = open("/dev/null", O_WRONLY);
dup2(tmpfd, 2);
close(tmpfd);
当然,诚邀您添加错误处理。
谢谢你们俩。我解决了将 stderr 重定向到 /dev/null 的问题。但是我必须启动子进程两次。首先,我检查它是否在抑制 stderr 的情况下启动,然后如果第一次成功,我会再次启动它。所以我对子进程有正确的默认标准错误,并且在失败的情况下没有shell输出。