2014-09-27 73 views
-1

我最近开始阅读关于管道的知识。我不明白它是如何在此代码中将文件描述符数字打印为4和3?了解UNIX中的管道

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
int main(){ 
int pfds[2]; 
char buf[30]; 
if (pipe(pfds) == -1) { 
perror("pipe"); 
exit(1); 
} 
printf("writing to file descriptor #%d\n", pfds[1]); 
write(pfds[1], "test", 5); 
printf("reading from file descriptor #%d\n", pfds[0]); 
read(pfds[0], buf, 5); 
printf("read \"%s\"\n", buf); 
return 0; 
} 

输出:
写入文件描述符#4

从文件描述符#阅读3

阅读 “测试”

这里为什么/它是如何印刷4和3?

+0

你期待它们是什么? – 2014-09-27 13:32:53

回答

2

文件描述符被分配为可用的最小值。当应用程序启动时(它们继承stdin,stdout和stderr),0,1和2已经被占用,所以接下来的两个描述符将是3和4.

+0

这个实现是否依赖于?在我使用的少数操作系统上似乎是真的,我很好奇,如果这是惯例或标准或运气。 – cschneid 2014-09-27 13:50:02

+0

@cschneid:['open()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) 的POSIX规范说:_ open()函数将返回一个文件描述符该命名文件是当前没有为该进程打开的最低文件描述符._这是符合POSIX标准的系统上的必需行为。 – 2014-09-27 15:27:29