fcntl.h不包含所有状态标志常量

时间:2011-02-26 05:45:14

标签: constants definition fcntl

我一直在浏览头文件,但我找不到任何带状态标志定义的文件(如O_RDONLY)。

谢谢, 约翰

1 个答案:

答案 0 :(得分:2)

<强>摘要

如果您使用的是Linux,则应该位于/usr/include/bits/fcntl.h

#define O_RDONLY 00

您可以使用rgrepctagsVimcppcwhere找到它。


<强> rgrep

最简单的方法是使用rgrep,a.k.a。grep -R

$ rgrep O_WRONLY .
./X11/Xw32defs.h:#  define O_WRONLY    _O_WRONLY
./linux/fs.h: * to O_WRONLY and O_RDWR via the strange trick in __dentry_open()
./linux/smbno.h:#define SMB_O_WRONLY    0x0001
./asm-generic/fcntl.h:#define O_WRONLY  00000001
./security/_pam_macros.h:    if ((fd = open(_PAM_LOGFILE, O_WRONLY|O_NOFOLLOW|O_APPEND)) != -1) {
./security/_pam_macros.h:    if ((fd = open(_PAM_LOGFILE, O_WRONLY|O_APPEND)) != -1) {
./security/_pam_macros.h:    if ((fd = open(_PAM_LOGFILE, O_WRONLY|O_NOFOLLOW|O_APPEND)) != -1) {
./security/_pam_macros.h:    if ((fd = open(_PAM_LOGFILE, O_WRONLY|O_APPEND)) != -1) {
./bits/fcntl.h:#define O_WRONLY      01

<强>的ctags

或者,您可以在ctags -R中运行/usr/include,然后运行vim -t O_WRONLY

或者,更好一点,但更多打字:

find . /usr/include -name "*.h" | 
ctags -f - -L - |
grep "^O_WRONLY   " |
cut -d "    " -f 1,2,3 |
sed -e 's# /\^#    #;s#\$/\;"$##'

<强> CPP

我找到的最好方法是使用cpp

假设您有一个名为YOUR_SOURCE_FILE且包含必要#include的源文件,请尝试运行:

cpp -dD YOUR_SOURCE_FILE | less

然后搜索您的#define,例如/O_WRONLY,然后向上滚动以查找其上方的第一个文件名。在这种情况下:

# 27 "/usr/include/bits/fcntl.h" 2 3 4

表示如果您包含O_WRONLY中提到的三个标头文件,则会从/usr/include/bits/fcntl.h选择man fcntl


<强> cwhere

我有一个名为cwhere的脚本来自动运行cpp

$ cwhere O_WRONLY sys/types.h sys/stat.h fcntl.h
/usr/include/bits/fcntl.h: #define O_WRONLY 01

Download cwhere here

如果安装了desc,您只需输入使用该#define的函数的名称,例如

$ cwhere O_WRONLY 'fcntl()'
/usr/include/bits/fcntl.h: #define O_WRONLY 01

Download desc here