C 重定向标准输入/输出/错误
我正在尝试用c创建一个linux守护进程,并找到了一些 除了试图重定向STDIN、STDOUT和STDERR(到/dev/null/)之外,我理解所有代码。我在这里还发现了一些与为什么应该重定向有关的问题(我理解) 具体而言,我的问题涉及的代码部分是:C 重定向标准输入/输出/错误,c,linux,C,Linux,我正在尝试用c创建一个linux守护进程,并找到了一些 除了试图重定向STDIN、STDOUT和STDERR(到/dev/null/)之外,我理解所有代码。我在这里还发现了一些与为什么应该重定向有关的问题(我理解) 具体而言,我的问题涉及的代码部分是: /* Route I/O connections */ /* Open STDIN */ i = open("/dev/null", O_RDWR); /* STDOUT */ dup(i); /* STDERR */ dup(i); 读
/* Route I/O connections */
/* Open STDIN */
i = open("/dev/null", O_RDWR);
/* STDOUT */
dup(i);
/* STDERR */
dup(i);
读取它意味着dup()
只是复制一个文件描述符
所以我不明白这是怎么重定向的?编译器是从上一行的注释中得到提示?还是缺少一些代码?是完全错误?还是我缺少dup手册页中的某些内容?: dup(oldfd)系统调用创建文件描述符oldfd的副本, 将编号最低的未使用描述符用于新描述符 如果您看到引用的代码,他将首先关闭所有打开的文件描述符:
for (i = getdtablesize(); i >= 0; --i)
{
close(i);
}
之后,当您调用dup(i)
时,它会将文件描述符i复制到最低可用描述符,即0(stdin
)。再次这样做将把它复制到描述符1(stdout
)和描述符2(stderr
)。这样,守护进程的stdin
、stdout
和stderr
都指向/dev/null
每个进程都会获得三个打开的文件描述符,它们是stdin
、stdout
和stderr
(这些描述符通常分别具有值0、1和2)。例如,当调用printf()
时,它会写入stdout
描述符所指向的文件。通过将此描述符指向另一个文件(如/dev/null
),此进程的任何输出都将重定向到该文件。同样的逻辑适用于stdin
和stderr
在shell上,当您运行类似于
ls>ls.out
的操作时,shell也会执行相同的操作。它fork()
s一个新进程,打开ls.out进行写入,并调用dup
(或dup2
)将ls.out
的文件描述符复制到此进程的stdout 从dup的手册页:
dup(oldfd)系统调用创建文件描述符oldfd的副本,
将编号最低的未使用描述符用于新描述符
如果您看到引用的代码,他将首先关闭所有打开的文件描述符:
for (i = getdtablesize(); i >= 0; --i)
{
close(i);
}
之后,当您调用dup(i)
时,它会将文件描述符i复制到最低可用描述符,即0(stdin
)。再次这样做将把它复制到描述符1(stdout
)和描述符2(stderr
)。这样,守护进程的stdin
、stdout
和stderr
都指向/dev/null
每个进程都会获得三个打开的文件描述符,它们是stdin
、stdout
和stderr
(这些描述符通常分别具有值0、1和2)。例如,当调用printf()
时,它会写入stdout
描述符所指向的文件。通过将此描述符指向另一个文件(如/dev/null
),此进程的任何输出都将重定向到该文件。同样的逻辑适用于stdin
和stderr
在shell上,当您运行类似于
ls>ls.out
的操作时,shell也会执行相同的操作。它fork()
s一个新进程,打开ls.out进行写入,并调用dup
(或dup2
)将ls.out
的文件描述符复制到此进程的stdout 理解链接到的示例代码的前一部分很重要:
/* close all descriptors */
for (i = getdtablesize(); i >= 0; --i)
{
close(i);
}
这将关闭所有打开的文件描述符,包括STDIN
、STDOUT
和STDERR
如open()
的手册页所述
成功调用返回的文件描述符将是进程当前未打开的编号最低的文件描述符
因此,在示例代码中对open()
的后续调用将把文件描述符0
重定向到/dev/null
,即STDIN
对dup()
的后续调用将使用下一个最低的数字复制文件描述符STDOUT
是1
,STDERR
是2
dup()
的手册页说明:
dup()系统调用使用编号最低的未使用描述符创建文件描述符oldfd的副本
理解链接到的示例代码的前一部分很重要:
/* close all descriptors */
for (i = getdtablesize(); i >= 0; --i)
{
close(i);
}
这将关闭所有打开的文件描述符,包括STDIN
、STDOUT
和STDERR
如open()
的手册页所述
成功调用返回的文件描述符将是进程当前未打开的编号最低的文件描述符
因此,在示例代码中对open()
的后续调用将把文件描述符0
重定向到/dev/null
,即STDIN
对dup()
的后续调用将使用下一个最低的数字复制文件描述符STDOUT
是1
,STDERR
是2
dup()
的手册页说明:
dup()系统调用使用编号最低的未使用描述符创建文件描述符oldfd的副本
该示例是否在创建新的STDIN、STDOUT和STDERR之前关闭了现有的STDIN、STDOUT和STDERR?因此,下一个要使用的免费fd将是0,然后是1,然后是2。该示例在创建新的STDIN、STDOUT和STDERR之前是否关闭了现有的STDIN、STDOUT和STDERR?因此,下一个可用fd将是0,然后是1,然后是2的可能副本