- 论坛徽章:
- 0
|
原帖由 cu_liang 于 2008-4-11 10:52 发表 ![]()
在APUE第三章中讲到
dup2( filedes, filedes2 );
is equivalent to
close( filedes2 );
fcntl( filedes, F_DUPFP, filesdes2 );
那为什么在执行下面这段代码时,还能打印出 ...
其实重点不是在dup2(),对于下面的代码:
- #include<stdio.h>
- #include<unistd.h>
- #include<fcntl.h>
- #include<sys/types.h>
- #include<stdlib.h>
- int main()
- {
- close(STDOUT_FILENO);
- write(0, "hello\n", 6);
- return 0;
- }
复制代码
照样可以输出hello来。
而dup2()完成的功能是什么呢?它是让文件描述符的指针指向文件表。
当dup2(0, STDOUT_FILENO);时 首先关闭STDOUT_FILENO,也就是将标准输出关闭掉。此时再让STDOUT_FILENO描述符的指针指向STDIN_FILENO所指向的那个文件表。所以说对于楼主所列的第一个代码仍然可以输出也就是这样的原因。
- #include <unistd.h>
- #include <stdio.h>
- int main()
- {
- dup2(0, STDOUT_FILENO );
- printf("how!!\n" );
- }
复制代码
此时STDIN_FILENO,STDOUT_FILENO两个都指向的是标准输入,也即是0的那个文件表,而这个又与终端相连,所以能够输出数据来。
不信你可以这样来试试,
gcc test.c -o test
./test 1>test.out
此时你可以看到那个how!!仍然是打印到终端而没有写入到test.out中,证明不是从标准输出得到的数据。
而如果
./test 0>test.out
你则可以看到那个how!!输出到了test.out文件中。证明是从标准输入这个描述符得到的数据。
不知道我说清楚没有?有什么大家再一起讨论。 |
评分
-
查看全部评分
|