dup(fd)的语意是返回的新的文件描述符与fd共享一个文件表项。就如after dup图中的s_fd和fd1共享文件表1一样。</p> 确定第二个方案后重定向后的恢复就很容易了,只需调用dup2(s_fd, n_fd);即可。下面是一个完整的例子程序:8 P5 E& b8 p6 `( B, W
#define TESTSTR “Hello dup2\n”
/ d9 m7 h: ]4 x' B; E #define SIZEOFTESTSTR 11
( x: D8 b+ d) Z3 {) w- \ int main() {8 w. s( u$ g" ~$ a- n& p0 t+ L0 ?/ n
int fd3;
0 I' z' @ o. e2 w( r int s_fd;
$ B, c8 Q( |5 X/ y$ h" @ int n_fd;* c7 d7 y+ N" X) i
fd3 = open(“testdup2.dat”, 0666);
7 u/ N- x! B9 C' ^' Q2 s# r if (fd3 《 0) {1 I# P0 g7 ~8 p( ] }% d* e
printf(“open error\n”);
5 M v( `. g6 n* M exit(-1);
, G; g3 n, j" I' \) h }
: u, U' f- z) H/ \/* 复制标准输出描述符 */, R; V5 [9 h: u: U( I
s_fd = dup(STDOUT_FILENO);" S& n; j1 d1 N) U: Y: x; e
if (s_fd 《 0) {# }7 j# S% Z9 {5 u _
printf(“err in dup\n”);4 c2 }; f% t/ d2 [1 V
}" A& [: g A- c- n" D( n6 R
/* 重定向标准输出到文件 */
( y6 G& I$ Z) i8 e! e n_fd = dup2(fd3, STDOUT_FILENO);. F* g, q% i' h9 S9 {( S, f
if (n_fd 《 0) {4 E! W3 j4 p( l
printf(“err in dup2\n”);
; V: V: y6 K: g9 Y }- Q* |* m/ [0 S" r
write(STDOUT_FILENO, TESTSTR, SIZEOFTESTSTR); /* 写入testdup2.dat中 */
F8 ], k' W- T7 v3 F1 _( G /* 重定向恢复标准输出 */: H5 F; `* W/ `( P$ R+ _/ V' ~
if (dup2(s_fd, n_fd) 《 0) {3 p# R% a N* W
printf(“err in dup2\n”);' |: W' r* e4 H4 _
}$ u, x% E0 \. h3 I
write(STDOUT_FILENO, TESTSTR, SIZEOFTESTSTR); /* 输出到屏幕上 */
+ {' ]2 W" l. V4 v" \$ m return 0;' X* y7 I$ G7 {) K! Q3 Q6 ]/ G
}+ T- P+ J! v: J7 }, d
注意这里我在输出数据的时候我是用了不带缓冲的write库函数,如果使用带缓冲区的printf,则最终结果为屏幕上输出两行“Hello dup2”,而文件testdup2.dat中为空,原因就是缓冲区作怪,由于最终的目标是屏幕,所以程序最后将缓冲区的内容都输出到屏幕。 |