重定向STDIN / OUT / ERR

时间:2016-12-02 16:20:47

标签: c linux

我正在尝试在c中创建一个linux守护进程并找到一些sample code on this page

我理解所有代码,除了它尝试重定向STDIN,STDOUT和STDERR(到/ dev / null /)。我还在这里找到了一些与为什么相关的问题,这些问题应该被重定向(我理解)。

具体来说,我的问题涉及的代码部分是:

/* Route I/O connections */

/* Open STDIN */
i = open("/dev/null", O_RDWR);

/* STDOUT */
dup(i);

/* STDERR */
dup(i);

阅读man page for dup()表示dup()只是复制文件描述符。

所以我不明白这是怎么做的重定向?编译器是否从上面一行中的注释中获取提示?或者是否缺少某些代码?,它是完全错误的吗?还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

来自dup:

的手册页
  

dup(oldfd)系统调用创建文件描述符oldfd的副本,   使用编号最小的未使用描述符作为新描述符。

如果您看到引用的代码,他首先关闭所有打开的文件描述符:

Var

之后,当您调用 for (i = getdtablesize(); i >= 0; --i) { close(i); } 时,它会将文件描述符i复制到最低可用描述符,该描述符将为0(dup(i))。再次执行此操作会将其复制到描述符1(stdin),对于描述符2(stdout)也是如此。通过这种方式,守护程序进程的stderrstdinstdout指向stderr

每个进程都有三个打开的​​文件描述符,即/dev/nullstdinstdout(这些描述符通常分别具有值0,1和2)。例如,当您调用stderr时,它会写入printf()描述符指向的文件。通过将此描述符指向另一个文件(例如stdout),此进程的任何输出都将重定向到该文件。同样的逻辑适用于/dev/nullstdin

在shell上,当你运行stderr之类的东西时,shell会做同样的事情。它ls > ls.out是一个新进程,打开ls.out进行写入,并调用fork()(或dup)将dup2的文件描述符复制到此进程'标准输出。