fcntl.h содержит не все константы флагов состояния - PullRequest
1 голос
/ 26 февраля 2011

Я просматривал заголовочные файлы и не смог найти ни одного файла с определениями флагов состояния (например, O_RDONLY).

Спасибо, Джон

1 Ответ

2 голосов
/ 26 февраля 2011

Сводка

Если вы работаете в Linux, оно должно быть в /usr/include/bits/fcntl.h.

#define O_RDONLY 00

Вы можете найти его, используя rgrep, илиctags и Vim, или cpp, или cwhere.


rgrep

Самый простой способ - использовать rgrep,aka 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

Скачать где-нибудь здесь

Если установлена ​​desc, вы можете просто ввести название функции, которая использует эту #define, например,

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

Скачать описание здесь

...