程序输出重定向


Answers:


11

该假定程序将写入您指定的文件描述符号。考虑以下hello world程序:

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

编译它

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

现在很简单

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

没有5的文件,所以没有字节写入。

下次尝试:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

我在指定文件和文件描述符(例如5>u)的同时设法获得输出。

实际上,除非您编写了上述有趣的程序,否则您不太可能使用来收集数据5>foo

在shell脚本中,使用<()进行构造更有用:

 diff <( cmd -par 1 ) <(cmd -par 2)

write()回报ssize_t,不是int
安德鲁·亨利

那不是问题的重点,printf函数也有回报。
Archemar

不使用返回值与使用错误类型有很多不同。
安德鲁·亨利

编辑我看不到输出的变化...
Archemar

10

数字代表文件描述符(已打开文件的句柄)。

弹壳通常自动有3套,

0-标准输入1-标准输出2-标准错误

但是可以打开更多文件,并且数字递增。


7

这些数字是文件描述符。如您所述,有几个是自动创建的。当打开其他文件或类似文件的内容时,它们将获得其他编号。

在任何特定程序中使用的数字取决于该程序打开或以其他方式使用的文件。例如,如果要“保存”当前的s​​tdin并从其他地方临时重定向stdin,然后稍后将其还原,则可以执行以下操作:

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

因此,此脚本将4至少在一段时间内具有文件描述符。那4可以是任何未使用的东西(嗯,一个进程可以打开多少个文件有一个限制,但是在这个限制之内的任何东西)。

您可以通过查看来查看进程打开了哪些文件描述符,以及打开了哪些文件描述符/proc/<pid>/fd。这显示了该进程的所有打开文件描述符<pid>以及与之关联的文件。


0

任何进程都将整数作为文件描述符,其中POSIX中有三个保留的整数:0是stdin,1是stdout,2是stderr。其他文件将被分配更多编号。您可以使用此程序轻松检查它,将其另存为fdtest.c,以便它在运行时打开自己的程序代码:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

编译:

gcc fdtest.c -o fdtest

运行:

./fdtest

您将得到的输出是这样的:

3

...,它是变量引用的文件的文件描述符的编号fd

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.