我正在实现一个库来运行命令.Linux上的库是C语言.
它目前执行popen()调用来运行命令并获取输出.问题是该命令继承了所有当前打开的文件处理程序.
如果我做了一个fork/exec,我可以明确地关闭孩子的处理程序.但这意味着重新实现popen().
我可以在所有处理程序上设置close-on-exec而不必逐个循环它们吗?
我可以将close-on-exec设置为进程的默认值吗?
谢谢!
我有一个TCP服务器应用程序偶尔需要通过关闭它们然后稍后打开它们来重新配置绑定端口.
应用程序还需要执行与之通信的外部二进制文件.目前使用popen()调用完成此操作.外部二进制运行时间可以跨越需要重新配置网络端口的时间段.
问题是,当主应用程序关闭一个端口时,它由popen为运行二进制文件创建的'forked'进程接管.
这是有意义的(讨论在tcp服务器在接受之前绑定和分叉时会发生什么?哪个进程会处理客户端请求?),但这是不可取的,因为主应用程序无法重新打开端口.
是否可以使用popen(3)中可用的FD_CLOEXEC O_CLOEXEC?应用程序需要popen(3)提供的管道作为stdin到执行的二进制文件,当CLOEXEC关闭其他文件时,文件句柄保持打开状态.
有没有更好的方法来运行二进制文件,这不会导致分支进程保持一个封闭的端口?
在没有继承句柄的情况下如何分叉进程还有另一个可能相关的问题?