这两天在看 《Unix 环境高级编程》,学到了不少好姿势,还意外地考了一次古。
dup & dup2
关于这两个系统调用,Unix 圣经里已经介绍得很清楚了, man dup
可以看用法。
1 |
|
两函数的返回:若成功为新的文件描述符,若出错为-1
,返回的新文件描述符与参数 filedes
共享同一个文件表项。
由
dup
返回的新文件描述符一定是当前可用文件描述符中的最小数值。
用dup2
则可以用filedes2
参数指定新描述符的数值。如果filedes2
已经打开,则先将其关闭。如若filedes
等于filedes2
,则返回filedes2
,而不关闭它。
有关这部分的知识点我就不啰嗦了,放截图:
这两款调用非常给力,它们经常用来重定向进程的 stdin,stdout
.
重定向
好似抗战片中,我铁道游击队阻击日本鬼子,将铁轨移到别的路上:或南辕北辙,转向一条错误的道路 fd
;或干脆把铁轨坠下深谷 /dev/null
。
但是,后来问题来了:
你为了让自己干活方便,把管子移到别处了,你干完活后,总不能留下一地鸡毛就走吧,为了不影响后来人,得把现场恢复。
看了下前辈们的血泪史,偶遇一个11
年前的好贴 《使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出??》 解决了心中疑惑。
Demo
来来来,搞个 demo 验证下:
1 |
|
编译,运行:
1 | hxz@pc0170:~/workspace/c++$ gcc -o dup dup.c |
归纳一下,利用 dup/dup2
处理 i/o
的大致流程:
1 | fd2 = dup(STDOUT_FILENO); //fd2表示stdout |
小明在 2016 年了翻出了 2004 的技术帖,今天真是考得一首好古啊~蛤蛤