LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1146|回复: 3

请教个C的问题,有关OPEN函数的

[复制链接]
发表于 2008-9-26 10:47:03 | 显示全部楼层 |阅读模式
语句
idh=open(nh,0000,0666);
怎么理解啊?
查了open的用法,没有找到这样的说明啊
发表于 2008-9-27 08:42:21 | 显示全部楼层
如果从语义上来说, 那么 nh 应该是一个字符串或者指针, 表示文件名, 0666 表示如果文件不存在, 且打开模式有 O_CREAT 的话, 那么新创建的文件的权限位是 0666.

问题在于 0000 这个参数, 它表示打开模式为 0. 根据文档, O_RDONLY, O_WRONLY, O_RDWR 这三个中必须指明且仅指明一个, 根据 fcntl.h 中的定义, O_RDONLY 的值为 0x0000, 因此这句代码最终可理解成

idh = open(nh, O_RDONLY, 0666);

实际上由于没有指定 O_CREAT, 那么 0666 应该也不会产生作用, 于是应该可以进一步简化为

idh = open(nh, O_RDONLY);
回复 支持 反对

使用道具 举报

发表于 2008-9-28 15:29:10 | 显示全部楼层
O_RDONLY, O_WRONLY, O_RDWR 可以和下面的组合使用。但是0000表示的只是O_RDONLY:

O_CREAT        如果需要打开的文件不存在则自动建立该文件。
O_EXCL
        如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且需要打开的文件为符号连接,则会打开文件失败。
O_NOCTTY         如果需要打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
O_TRUNC
        若文件存在并且以可写的方式打开时,会将文件长度清为0,而原来存于该文件的资料也会消失。
O_APPEND
        当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK         以非阻塞的方式打开文件,即无论有无数据读取或等待,都会立即返回。
O_NDELAY        同O_NONBLOCK。
O_SYNC        以同步的方式打开文件。
O_NOFOLLOW         如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。
O_DIRECTORY         如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。
回复 支持 反对

使用道具 举报

发表于 2008-9-28 15:31:49 | 显示全部楼层
open有两种形式:
       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

mode_t的含义是和权限相关的

mode的可以为以下的值:
S_IRWXU(00700):拥有者可读、可写、可执行。
S_IRUSR (S_IREAD,00400): 拥有者可读。
S_IWUSR (S_IWRITE,00200): 拥有者可写。
S_IXUSR (S_IEXEC,00100): 拥有者可执行。
S_IRWXG(00070):组可读、可写、可执行。
S_IRGRP(00040):组可读。
S_IWGRP(00020):组可写。
S_IXGRP(00010):组可执行。
S_IRWXO(00007):其他人可读、可写、可执行。
S_IROTH(00004):其他人可读。
S_IWOTH(00002):其他人可写。
S_IXOTH(00001):其他人可执行。
回复 支持 反对

使用道具 举报

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

本版积分规则

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