天天看点

o_rdonly,如何理解O_RDONLY = 0?

o_rdonly,如何理解O_RDONLY = 0?

I am dealing with file status flags.

Among test I performed, I found

#include

#include "fcntl.h"

int main() {

const int flag = O_RDONLY;

printf( "*** Flag O_RDONLY = %5d\n", flag);

return 0;

}

produces this output

*** Flag O_RDONLY = 0

which is fully consistent with

#define O_RDONLY 00

from fcntl-linux.h.

How can the value zero be used as a flag?

I expect an "atomic" flag to be 2^n (n>=1), and "composite" flags (like O_ACCMODE) to be simply the sum of several atomic flags (which is the same as bitwise-or'ing those atomic flags).

As far as I understand, I cannot "detect" anything, and such flag cannot be ever set.

A bitwise-and'ed expression like (stat & O_RDONLY) will always be false.

Related:

解决方案

Although these are called flags in the documentation, these three are not actually atomic flags that can be combined like the rest. They're mutually exclusive alternative values for the O_ACCMODE bits. You don't use stat & RDONLY to test for it, you use (stat & O_ACCMODE) == O_RDONLY.