首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

用fcntl回获取stdin的标志位,加上了重定向以后结果就变了.为什么

2013-08-01 
用fcntl来获取stdin的标志位,加上了重定向以后结果就变了.为什么?有下面这个小程序,用来测试一个文件描述

用fcntl来获取stdin的标志位,加上了重定向以后结果就变了.为什么?
有下面这个小程序,用来测试一个文件描述符的文件状态标志:


int main(int argc,char* argv[])
{
    if(argc!=2){
        puts("argc!=2");
        return 1;
    }
    int val=fcntl(atoi(argv[1]),F_GETFL,0);
    int accmode=val&O_ACCMODE;
    switch(accmode){
        case O_RDONLY:
            puts("read only");
            break;
        case O_WRONLY:
            puts("write only");
            break;
        case O_RDWR:
            puts("read write");
            break;
        default:
            puts("error");
            break;
    }
    if(val&O_APPEND)puts("append");
    if(val&O_NONBLOCK)puts("nonblock");
    if(val&O_SYNC)puts("synchronous write");
    putchar('\n');
    return 0;
}

编译运行:

# ./a.out 0
read write
append

但是我如果加上了一个重定向:

# tty
/dev/pts/0
# ./a.out 0 0< /dev/pts/0
read only

既然tty命令已经告诉我了,当前的tty就是/dev/pts/0,那么我把这个重定向到0应该相当于什么事情都没有做吧? 为什么a.out的结果就不同了呢?
[解决办法]
./a.out 0 0< /dev/pts/0
那是因为你明确指定了只读了

你试试
./a.out 0 0<> /dev/pts/0
./a.out 0 0> /dev/pts/0

热点排行