Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 重定向标准输入/输出/错误_C_Linux - Fatal编程技术网

C 重定向标准输入/输出/错误

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); 读

我正在尝试用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);
读取它意味着
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的可能副本