当前位置: 技术问答>linux和unix
问《UNIX环境高级编程》里一个小问题
来源: 互联网 发布时间:2016-03-08
本文导语: 今天在《UNIX环境高级编程》里面看到这么一段话:三个访问方式标志(O_RDONLY,O_WRONLY,O_RDWR)并不各占一位(正如前述,这三种标志的值分别是0、1、2,由于历史原因。这三种值互斥——一个文件只能有这三种值之一)...
今天在《UNIX环境高级编程》里面看到这么一段话:三个访问方式标志(O_RDONLY,O_WRONLY,O_RDWR)并不各占一位(正如前述,这三种标志的值分别是0、1、2,由于历史原因。这三种值互斥——一个文件只能有这三种值之一)。因此首先必须用屏蔽字O_ACCMODE取得访问模式位,然后讲结果与这三种值中的任一种做比较。
我不是很理解这句话的意思,希望有朋友能帮我解答一下。非常感谢!
我不是很理解这句话的意思,希望有朋友能帮我解答一下。非常感谢!
|
书上的例子不是已经说的很清楚了么?
就是说用flags = fcntl(fd, F_GETFL, 0)后
不能用位与的方法 if (flags & O_RDONLY)的来判断文件的只读标志.
要用if ( (flags & O_ACCMODE) == O_RDONLY)来判断;
而其他的标志, 如 O_NONBLOCK, O_APPEND等是每个标志占一位的, 所以可以直接用位与的方法来判断:
如 if (flags & O_NONBLOCK) 可以判断文件描述符是否为非阻塞的.
就是说用flags = fcntl(fd, F_GETFL, 0)后
不能用位与的方法 if (flags & O_RDONLY)的来判断文件的只读标志.
要用if ( (flags & O_ACCMODE) == O_RDONLY)来判断;
而其他的标志, 如 O_NONBLOCK, O_APPEND等是每个标志占一位的, 所以可以直接用位与的方法来判断:
如 if (flags & O_NONBLOCK) 可以判断文件描述符是否为非阻塞的.
/* open-only flags */
#define O_RDONLY 0x0000 /* open for reading only */
#define O_WRONLY 0x0001 /* open for writing only */
#define O_RDWR 0x0002 /* open for reading and writing */
#define O_ACCMODE 0x0003 /* mask for above modes */
#if __BSD_VISIBLE
#define FREAD 0x0001
#define FWRITE 0x0002
#endif
#define O_NONBLOCK 0x0004 /* no delay */
#define O_APPEND 0x0008 /* set append mode */
#if __BSD_VISIBLE
#define O_SHLOCK 0x0010 /* open with shared file lock */
#define O_EXLOCK 0x0020 /* open with exclusive file lock */
#define O_ASYNC 0x0040 /* signal pgrp when data ready */
#define O_FSYNC 0x0080 /* synchronous writes */
#endif
#define O_SYNC 0x0080 /* POSIX synonym for O_FSYNC */
#if __BSD_VISIBLE
#define O_NOFOLLOW 0x0100 /* don't follow symlinks */
#endif
#define O_CREAT 0x0200 /* create if nonexistent */
#define O_TRUNC 0x0400 /* truncate to zero length */
#define O_EXCL 0x0800 /* error if already exists */
#ifdef _KERNEL
#define FHASLOCK 0x4000 /* descriptor holds advisory lock */
#endif
/* Defined by POSIX 1003.1; BSD default, but must be distinct from O_RDONLY. */
#define O_NOCTTY 0x8000 /* don't assign controlling terminal */
#if __BSD_VISIBLE
/* Attempt to bypass buffer cache */
#define O_DIRECT 0x00010000
#endif
|
fcntl用F_GETFL返回的文件状态标志除了O_RDONLY,O_WRONLY和O_RDWR外还有其它标志,如O_APPEND,O_NONBLOCK,O_SYNC和O_ASYNC,这些也是关于读写方式的(阻塞或非阻塞,异步等等)。。