当管道写入标准输出时,为什么 write() 会退出程序?
我有一个服务器应用程序,它在单独的线程中写入 popen("myCommand", "w") 文件描述符,如果传递给 popen() 的命令导致任何输出到 stdout 或 stderr,则我的应用程序退出。但是,这只是当我的服务器应用程序通过 inetd 调用时才会出现的问题,如果我使用 ssh 启动服务器,则不会出现此问题。
类似地,当我的服务器应用程序在单独的线程中读取 popen("myCommand2", "r") 文件描述符时,如果传递给 popen() 的命令导致任何输出到 stderr(stdin 将进入我的管道),则应用程序退出。同样,这只发生在 inetd 调用时,而不是 ssh 调用时。
I have a server application that writes to a popen("myCommand", "w") file descriptor in a separate thread and if the command passed to popen() results in any output to stdout or stderr, the my application exits. However, this is only an issue when my server application was invoked via inetd, if I used ssh to launch the server, it does not have this issue.
Similarly, when my server application reads from a popen("myCommand2", "r") file descriptor in a separate thread and if the command passed to popen() results in any output to stderr (stdin is going to my pipe), the application exits. Again, this only occurs with inetd summoning, not ssh summoning.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你需要在打开管道之前关闭进程中所有存在的fd,然后进行I/O重定向。这是因为如果是 inetd,该进程将作为守护进程运行。
you need to close all existed fds of the process before open the pipe, then do i/o redirection. that's because if inetd, the process runs as a daemon.