linux 关闭打开的文件描述符,关闭它们后重新打开stdout和stdin文件描述符
Ambroz Bizja..
39
您應該使用dup()和dup2()來克隆文件描述符.
int stdin_copy = dup(0);
int stdout_copy = dup(1);
close(0);
close(1);
int file1 = open(...);
int file2 = open(...);
< do your work. file1 and file2 must be 0 and 1, because open always returns lowest unused fd >
close(file1);
close(file2);
dup2(stdin_copy, 0);
dup2(stdout_copy, 1);
close(stdin_copy);
close(stdout_copy);
但是,您可能需要小心處理一些細節(來自man dup):
這兩個描述符不共享文件描述符標志(close-on-execflag).關閉重復描述符的close-on-exec標志(FD_CLOEXEC;請參閱fcntl(2)).
如果這是一個問題,您可能必須恢復close-on-exec標志,可能使用dup3()而不是dup2()來避免競爭條件.
另外,請注意,如果您的程序是多線程的,則其他線程可能會意外地寫入/讀取重新映射的stdin/stdout.
如果你是多線程的還有其他問題 - 如果另一個線程在你的`close(0)`(或`close(1)`)和相應的`open(...)`之間打開一個文件,那么它的文件將會成為stdin(或stdout).使用`dup2()`(或`dup3`)來強制文件描述符為0(或1),而不是依賴于"最低未使用"行為. (2認同)
總結
以上是生活随笔為你收集整理的linux 关闭打开的文件描述符,关闭它们后重新打开stdout和stdin文件描述符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼写检查工具是android,Andro
- 下一篇: android4.4.2fragment