FD_CLOEXEC标志的引人注目的用例是什么?

时间:2017-07-29 09:29:57

标签: linux unix fopen fcntl

我刚看过这个:

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及更高版本上),为什么这一点非常重要,只是为了避免一些线程间的问题同步?

1 个答案:

答案 0 :(得分:0)

我有一个用例,尽管它来自一个玩具程序(实际上是一项家庭作业)。

任务是编写一个带有两个参数的程序,这两个参数是可执行文件的名称。它将使用forkexec(或例如execve)启动它们,并用第一个程序的stdout写入读取为stdin,第二个程序。

用法示例:./mypipeprogram ./program1 ./program2的结果应与./program1 | ./program2相同。

我希望我的程序尽可能地接近防弹,这意味着要尽可能优雅地处理所有错误。

您必须原谅我,因为我认为我已经没有来源了,所以这是从记忆中来的。

我要处理的错误之一是无法exec列出其中一个程序,而另一个可以。在那种情况下,无法exec的进程可以kill另一个进程,因此它不会永远挂起或类似的东西。

事后看来,可能不是最好的主意,因为关闭管道应该可以正常工作。

仍然沿一种方式运行(我认为这是第一个过程,输出一个),我可以抓住这一点,而在尝试甚至kill另一个程序之前,exec是另一个过程

我所做的是打开另一个管道,并用fnctl FD_CLOEXEC进行了连接,这取决于POSIX的意思是“在成功执行其中一个exec函数后,文件将关闭。”

然后,第二个进程将准备exec,从该管道中读取数据,并在其关闭时知道第一个进程已成功exec完成,因此可以继续进行。如果第一个进程的exec失败,则管道仍将处于打开状态,因此第二个进程仍将在读取时被阻止,第一个进程可能会kill对其进行

TL; DR

我在管道上使用FD_CLOEXEC来允许一个进程等待第二个进程成功exec,或者如果kill被第二个进程exec接受失败。