LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: edwardhayes

学习fcntl的功能时例子程序,有点迷糊。

[复制链接]
 楼主| 发表于 2003-10-16 14:16:37 | 显示全部楼层
最初由 CharlesWang 发表
fnctl 用于 file descriptor 的各种各样的操作。
具体是什么操作(manipulate), 由 第二个参数 cmd 决定。
第一个参数是一个 file descriptor, 一般由 open 系统调用返回。
一个程序有 三个标准的 file descriptor , 在进程创建的时候打开。
0 stand in
1 stand out
2 stand err

运行结果是:
$./x 5 5</tmp/x
read only
$./x 5 5>/tmp/x
write only
$./x 5 5<>/tmp/x
read write,
$./x 5 5>>/tmp/x
write only, append

F_GETFL 用于得到 descriptor's flags . 也就是 open 的时候的 flag.

5 < /tmp/x 是 shell 的语法,用于把 file descriptor 5 用于输入。
同样
5 > /tmp/x 用于输出重定向。
5 <> /tmp/x  用于输入输出重定向
5 >> /tmp/x 用于追加输出重定向。


x 是编译连接的结果。

讲得很细,谢谢!
我不知道这些输入输出重定向应该到哪儿去查看资料,请指点!
 楼主| 发表于 2003-10-16 20:13:52 | 显示全部楼层
无双兄,能不能帮忙解释一下啊?
发表于 2003-10-16 20:27:33 | 显示全部楼层
sorry 刚才在忙其它的

程序打开后只有0 1 2
那其它的都是不存在的

fcntl它什么会有用呢

我再看看一下man先
发表于 2003-10-16 20:30:46 | 显示全部楼层
CharlesWang已经说清楚了

就是它说的原因

里面还带有shell功能
 楼主| 发表于 2003-10-16 20:49:40 | 显示全部楼层
但是
$./x 0
read write
$./x 1
read write
$./x 2
read write

我却不能解释。
我也想不通,照理说,应该是相应的打印出来啊,
怎么都会出来read write呢?
发表于 2003-10-17 02:36:15 | 显示全部楼层
我也测试了一下,确实是read write,程序没问题
发表于 2003-10-17 10:30:02 | 显示全部楼层
?????
晚上我回去再使用ftstat看看
发表于 2003-10-18 16:57:23 | 显示全部楼层
[php]
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
    for(int i =0;i<10;i++){
        char s[10];
        int result = fcntl(i,F_GETFL);
       
        if(result == -1)
            std::cout<<"get fd "<<i<<"file flag fail"<<std::endl;
        else switch(result &O_ACCMODE){
            case O_RDONLY:
                std::cout<<"get fd "<<i<<" sucess,readonly"<<std::endl;
                break;
            case O_WRONLY:
                std::cout<<"get fd "<<i<<" sucess,write only"<<std::endl;
                break;
            case O_RDWR:
                std::cout<<"get fd "<<i<<" sucess,read write"<<std::endl;
                if(write(i," ",2) != 2)
                    perror("write fd fail");
                else
                    std::cout<<"write fd succeed"<<std::endl;
                std::cout<< "read 1 byte"<<std::endl;
                if(read(i,s,1)!=1)
                    perror("read fd fail");
                else
                    std::cout<<"read fd succed"<<s[0]<<std::endl;
                break;
            default:
                std::cout<<"get fd "<<i<<" sucess,flag is:"
                    <<(result&O_ACCMODE)<<std::endl;
                break;
        }
    }
    return 0;
}


[/php]

上面写了个程序测试了一下
确实是可读可写的

只是写得不是很完整
                if(write(i," ",2) != 2)  //这里让输出再多点看看是不是有
                    perror("write fd fail");
                else
                    std::cout<<"write fd succeed"<<std::endl;
                std::cout<< "read 1 byte"<<std::endl;
                if(read(i,s,1)!=1)//这里也再多读点 看下面的结果会怎样
                    perror("read fd fail");
                else
                    std::cout<<"read fd succed"<<s[0]<<std::endl;


谁有时间的话修改一下好了
 楼主| 发表于 2003-10-18 21:04:15 | 显示全部楼层
改成c++了?
辛苦了!
发表于 2003-10-18 23:37:22 | 显示全部楼层
中间打印的那部分我开始时没有考虑好
你修改一下

0 时打印出来的会不会在屏幕上
   读进去的能不能写出来

同样还有1 2
这样就知道结果了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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