dup2 vs close +打开stdout重定向

时间:2016-09-22 07:39:21

标签: linux stdout system-calls dup

使用closeopen重定向标准输出:

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)

dup2open + close的区别?

1 个答案:

答案 0 :(得分:0)

当你这样做时

int fd = open("log", O_RDWR);

打开的文件可以是任何文件描述符。仅仅因为你关闭STDOUT_FILENO并不意味着它将被用于open()。即使系统选择了第一个可用的描述符(不能保证的话),仍有可能:

  • stdin也将关闭,并将首先被选中。
  • close()open()之间运行信号,信号处理程序打开文件。
  • open()失败,让您关闭stdout。

另一方面,dup2()版本通过明确指定文件描述符来确保文件描述符是正确的。此外,dup2()保证是原子的。也就是说,在任何时间点,STDOUT_FILENO都是有效的,或者它仍然是旧的,或者它是新的,旧的已经关闭。

作为旁注,在dup2之后,两个描述符编号都指向同一个文件,两者都需要close()。因此,如果您只是重定向stdout,则可能需要在close(fd)调用后dup2()