Answers:
该假定程序将写入您指定的文件描述符号。考虑以下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
。
这些数字是文件描述符。如您所述,有几个是自动创建的。当打开其他文件或类似文件的内容时,它们将获得其他编号。
在任何特定程序中使用的数字取决于该程序打开或以其他方式使用的文件。例如,如果要“保存”当前的stdin并从其他地方临时重定向stdin,然后稍后将其还原,则可以执行以下操作:
exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate
因此,此脚本将4
至少在一段时间内具有文件描述符。那4可以是任何未使用的东西(嗯,一个进程可以打开多少个文件有一个限制,但是在这个限制之内的任何东西)。
您可以通过查看来查看进程打开了哪些文件描述符,以及打开了哪些文件描述符/proc/<pid>/fd
。这显示了该进程的所有打开文件描述符<pid>
以及与之关联的文件。
任何进程都将整数作为文件描述符,其中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
。