我正在尝试在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()
只是复制文件描述符。
所以我不明白这是怎么做的重定向?编译器是否从上面一行中的注释中获取提示?或者是否缺少某些代码?,它是完全错误的吗?还是我错过了什么?
答案 0 :(得分:1)
来自dup:
的手册页dup(oldfd)系统调用创建文件描述符oldfd的副本, 使用编号最小的未使用描述符作为新描述符。
如果您看到引用的代码,他首先关闭所有打开的文件描述符:
Var
之后,当您调用 for (i = getdtablesize(); i >= 0; --i)
{
close(i);
}
时,它会将文件描述符i复制到最低可用描述符,该描述符将为0(dup(i)
)。再次执行此操作会将其复制到描述符1(stdin
),对于描述符2(stdout
)也是如此。通过这种方式,守护程序进程的stderr
,stdin
和stdout
指向stderr
。
每个进程都有三个打开的文件描述符,即/dev/null
,stdin
和stdout
(这些描述符通常分别具有值0,1和2)。例如,当您调用stderr
时,它会写入printf()
描述符指向的文件。通过将此描述符指向另一个文件(例如stdout
),此进程的任何输出都将重定向到该文件。同样的逻辑适用于/dev/null
和stdin
。
在shell上,当你运行stderr
之类的东西时,shell会做同样的事情。它ls > ls.out
是一个新进程,打开ls.out进行写入,并调用fork()
(或dup
)将dup2
的文件描述符复制到此进程'标准输出。