- 论坛徽章:
- 0
|
关于dup2()的疑问.
原帖由 "kj501" 发表:
int saved_fd ;
saved_fd = STDOUT_FILENO; /* 保存标准输出 */
dup2(saved_fd, STDOUT_FILENO); /* 恢复标准输出 */
我来检讨一下,由于我对dup2的使用在概念有理解错误,我给出的例子是行不通的。
经过试验,我发现dup2(int oldfd, int newfd)其中的newfd必须是一个实际打开文件的文件描述符,不能只是一个不指向任何文件的整数。
这是我作试验的代码:
- #include<unistd.h>;
- #include<stdlib.h>;
- #include<fcntl.h>;
- #include<sys/types.h>;
- #include<sys/stat.h>;
- int main()
- {
- int sfd,testfd;
- testfd = open("temp",O_CREAT | O_RDWR | O_APPEND);
- if (-1 == testfd) {
- printf("open file error.\n");
- exit(1);
- }
- /* 先复制一个真实的文件描述符 */
- sfd = dup(testfd);
- /* 保存标准输出 */
- if (-1 == dup2(STDOUT_FILENO,sfd) ) {
- printf("can't save fd \n");
- exit(1);
- }
- /* 重定向 */
- if (-1 == dup2(testfd,STDOUT_FILENO) ) {
- printf("can't redirect fd error\n");
- exit(1);
- }
- /* 此时向stdout写入应该输出到文件 */
- write(STDOUT_FILENO,"file\n",5);
- /* 恢复stdout */
- if (-1 != dup2(sfd,STDOUT_FILENO) ) {
- printf("recover fd ok \n");
- /* 恢复后,写入stdout应该向屏幕输出 */
- write(STDOUT_FILENO,"stdout\n",7);
- }
- }
复制代码
如果把其中的这一行注释掉:
dup2函数执行时肯定会失败。
但从代码中也可以看出,我前面提出的先保存文件描述符,然后在重定向之后再恢复回来的思路是行得能的。
有不当之处,还请大家多多指教! |
|