我在手册页上查了一下,但还是没有找到…
假设你有dup2(f1,0)
。是否会切换filedesc。1与stdin,然后锁定stdin?
dup2
不切换文件描述符,它使它们相等。在dup2(f1, 0)
之后,在描述符f1
上打开的任何文件现在也在描述符0上打开(以相同的模式和位置),即在标准输入上。
如果目标文件描述符(这里是0)是打开的,它将被dup2
调用关闭。因此:
before after
0: closed, f1: somefile 0: somefile, f1:somefile
0: otherfile, f1: somefile 0: somefile, f1:somefile
不涉及锁定。
dup2
是有用的(除其他外)当你的程序的一部分从标准文件描述符读写时。例如,假设somefunc()
从标准输入中读取,但是您希望它从程序其他部分获取标准输入的不同文件中读取。然后可以执行(错误检查省略):
int save_stdin = dup(0);
int somefunc_input_fd = open("input-for-somefunc.data", O_RDONLY);
dup2(somefunc_input_fd, 0);
/* Now the original stdin is open on save_stdin, and input-for-somefunc.data on both somefunc_input_fd and 0. */
somefunc();
close(somefunc_input_fd);
dup2(save_stdin, 0);
close(save_stdin);