关闭流程的所有管道

时间:2016-03-25 15:05:43

标签: shell pipe c++ fork

我正在制作一个与shell类似的程序,但只支持前台进程和管道。我有多个进程写入同一个管道和一些其他属性不同于管道的正常用法。无论如何,我的问题是,

除了三个基本的文件描述符之外,有没有简单的方法(自动)关闭进程的所有文件描述符?

我问这个问题,因为我在跟踪每个进程的所有文件描述符时遇到很多困难。有时候他们会以某种不可预知的方式对我采取行动。也可能是因为我对它们没有透彻的理解。

2 个答案:

答案 0 :(得分:3)

  

除了三个基本的文件描述符之外,有没有简单的方法(自动)关闭进程的所有文件描述符?

执行此操作的常规方法是简单地遍历所有这些并关闭它们:

for (i = getdtablesize(); i > 3;) close(--i);

那已经是一线了。它没有比那更“自动”了。

  

我问这个问题,因为我很难跟踪每个进程的所有文件描述符。

值得花些时间考虑一下你打开的每个文件描述符的生命周期,什么时候重复(例如dup2()fork()),它是如何被使用的,并确保你说明每个人不再需要时将如何关闭。通过不加区别地关闭文件描述符的问题来解决这个问题是不可持续的。

  

我有多个进程写入同一个管道

如果你这样做,那么你需要知道数据到达管道另一端的顺序是不可预测的。很难避免破坏数据流。

答案 1 :(得分:1)

使用closefrom(3) C库函数。

从联系手册:

  

closefrom ()系统调用会删除所有打开的文件描述符   来自每个进程对象引用表的 lowfd 。   关闭文件描述符时遇到的任何错误都将被忽略。

使用示例:

#include <unistd.h>

int main() {
    // Close everything except stdin, stdout and stderr
    closefrom(3); // Were 3 is the lowest file descriptor you wish to close

    printf("Clear of all, but the three basic file descriptors!\n");
    return 0;
}

这适用于大多数unices,但需要适用于Linux的libbsd支持库