我刚看过这个:
What does the FD_CLOEXEC fcntl() flag do?
我理解int a = b;
boolean b = false;
的作用,但不了解它为何如此重要。为什么不在int a = b; // What is b? is it a primitive variable or a value or a object reference
之前关闭所有相关的文件描述符?为什么将FD_CLOEXEC
设置为可以设置的特殊exec()
开放模式标志(在Linux 2.6.something及更高版本上),为什么这一点非常重要,只是为了避免一些线程间的问题同步?
答案 0 :(得分:0)
我有一个用例,尽管它来自一个玩具程序(实际上是一项家庭作业)。
任务是编写一个带有两个参数的程序,这两个参数是可执行文件的名称。它将使用fork
和exec
(或例如execve
)启动它们,并用第一个程序的stdout
写入读取为stdin
,第二个程序。
用法示例:./mypipeprogram ./program1 ./program2
的结果应与./program1 | ./program2
相同。
我希望我的程序尽可能地接近防弹,这意味着要尽可能优雅地处理所有错误。
您必须原谅我,因为我认为我已经没有来源了,所以这是从记忆中来的。
我要处理的错误之一是无法exec
列出其中一个程序,而另一个可以。在那种情况下,无法exec
的进程可以kill
另一个进程,因此它不会永远挂起或类似的东西。
事后看来,可能不是最好的主意,因为关闭管道应该可以正常工作。
仍然沿一种方式运行(我认为这是第一个过程,输出一个),我可以抓住这一点,而在尝试甚至kill
另一个程序之前,exec
是另一个过程
我所做的是打开另一个管道,并用fnctl
FD_CLOEXEC
进行了连接,这取决于POSIX的意思是“在成功执行其中一个exec函数后,文件将关闭。”
然后,第二个进程将准备exec
,从该管道中读取数据,并在其关闭时知道第一个进程已成功exec
完成,因此可以继续进行。如果第一个进程的exec
失败,则管道仍将处于打开状态,因此第二个进程仍将在读取时被阻止,第一个进程可能会kill
对其进行
我在管道上使用FD_CLOEXEC
来允许一个进程等待第二个进程成功exec
,或者如果kill
被第二个进程exec
接受失败。