使用close
和open
重定向标准输出:
close(STDOUT_FILENO);
int fd = open("log", O_RDWR);
printf("My output\n");
与通过dup2
的重定向不同:
int fd = open("log", O_RDWR);
dup2(fd, STDOUT_FILENO);
printf("My output\n");
strace
我看到第一种情况write
返回EBADF
:
$ strace -e write ./a.out
write(1, "My output\n", 10) = -1 EBADF (Bad file descriptor)
dup2
与open
+ close
的区别?
答案 0 :(得分:0)
当你这样做时
int fd = open("log", O_RDWR);
打开的文件可以是任何文件描述符。仅仅因为你关闭STDOUT_FILENO并不意味着它将被用于open()
。即使系统选择了第一个可用的描述符(不能保证的话),仍有可能:
close()
和open()
之间运行信号,信号处理程序打开文件。open()
失败,让您关闭stdout。另一方面,dup2()
版本通过明确指定文件描述符来确保文件描述符是正确的。此外,dup2()
保证是原子的。也就是说,在任何时间点,STDOUT_FILENO都是有效的,或者它仍然是旧的,或者它是新的,旧的已经关闭。
作为旁注,在dup2
之后,两个描述符编号都指向同一个文件,两者都需要close()
。因此,如果您只是重定向stdout,则可能需要在close(fd)
调用后dup2()
。