1 #include2 #include 3 #include 4 #include 5 #include 6 int main(void) 7 { 8 #define STDOUT 1 9 int nul, oldstdout; 10 char msg[] = "This is a test"; 11 /* create a file */ 12 nul = open("DUMMY.FIL", O_CREAT | O_RDWR, S_IREAD | S_IWRITE); 13 /* create a duplicate handle for standard 14 output */ 15 16 oldstdout = dup(STDOUT); //复制用于后续恢复 17 /* 18 redirect standard output to DUMMY.FIL 19 by duplicating the file handle onto the 20 file handle for standard output. 21 */ 22 dup2(nul, STDOUT); //将标准输出重定向到nul 23 /* close the handle for DUMMY.FIL */ 24 close(nul); 25 /* will be redirected into DUMMY.FIL */ 26 write(STDOUT, msg, strlen(msg)); 27 /* restore original standard output 28 handle */ 29 dup2(oldstdout, STDOUT); //将标准输出重定向到之前保存的标准输出 30 /* close duplicate handle for STDOUT */ 31 close(oldstdout); 32 return 0; 33 }
--------------------------------
进程fd表 ---- 文件表----v节点表
-------------------------------
指向关系改变:
dup2(nul, STDOUT)
STDOUT指向了nul的文件表;
dup2(oldstdout, STDOUT)
STDOUT指向了oldstdout保存的文件表;
打开文件的每个进程都有独立的文件表项,可以使每个进程都有自己对于该文件的当前偏移;