QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1191|回复: 2

关于stdin stdout的问题

[复制链接]
发表于 2006-5-3 18:28:13 | 显示全部楼层 |阅读模式
我发现stdin可以重定向到文件,然后还可以再恢复成键盘.但是stdout重定向成文件就不能恢复了,不知为什么请大家解决.
下面的第一段程序可以证明stdin重定向可以恢复(运行前需要在相同目录下建立一个叫tt.txt的文本文件,再在里面随便写点东西)
[code:1]#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
        char a[32],b[32];int fd;
        ll(&fd);
        scanf("%s",a);
        printf("%s\n",a);
        fflush(stdin);
        fclose(stdin);
        stdin=fdopen(1,"r");
        scanf("%s",b);
        printf("%s\n",b);
        return 0;
}

void ll(int *fd)
{
        *fd=open("tt.txt",O_RDONLY);
        fclose(stdin);
        stdin=fdopen(*fd,"r");
}

[/code:1]
下面的第二段程序在重新打开屏幕的文件描述符的时候总是遇到毛病.不知怎么回事
[code:1]#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <readline/readline.h>
#include <readline/history.h>

int main()
{
        int fdin,fdout;char *a;
        if(creat("tt",O_CREAT|O_TRUNC|O_WRONLY)==-1)
        {
                printf("create file error!\n");
                exit(0);
        }

        fdin=open("tt",O_RDONLY);
        fdout=open("tt",O_WRONLY);

        fclose(stdout);
        fclose(stdin);

        if((stdout=fdopen(fdout,"w"))==NULL)
        {
                exit(0);
        }
        if((stdin=fdopen(fdin,"r"))==NULL)
        {
                exit(0);
        }
       
        printf("test test\n");
        fflush(stdout);
        a=readline(NULL);

        fclose(stdout);
        if((stdout=fdopen(0,"w+"))==NULL)
                exit(0);
        printf("%s",a);

        return 0;
}

[/code:1]
发表于 2006-5-3 19:28:54 | 显示全部楼层
每一个进程都有它自己的file descriptor table。这个表的前3项分别对应标准输入、标准输出、标准错误。
close系统调用可以关闭任何打开的文件,包括这3个。而dup、open系统调用总是尽量使用file descriptor table中最靠前的位置。
重定向stdout其实也就是先close(1),再open你想要的文件,这个文件就会占用第2项,也就成了标准输出了。
重定向时关闭了的文件以后怎么可能还能用呢,你要是想以后再重定向回来,就得先把1号文件dup到别处去。
回复

使用道具 举报

 楼主| 发表于 2006-5-3 20:58:05 | 显示全部楼层
非常感谢指教,通过你说的dup已经把问题解决了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 16:30 , Processed in 0.065434 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表