<fcntl.h>中0对应的oflag是什么?sem_open参数0含义及标志数值查询
关于sem_open中oflag参数0的疑问解答
1. 0是否等同于O_RDWR?
不是。sem_open的oflag参数传0时,表示仅打开已存在的信号量,不设置任何额外标志,这和O_RDWR完全不是一回事。O_RDWR是针对文件读写的标志,而信号量打开后默认就支持P/V这类核心操作,不需要显式指定O_RDWR。如果要创建新的信号量,才需要传入O_CREAT这类标志,同时配合第三个mode参数使用。
2. fcntl.h中各标志的数值查询方法
给你几个实用的查询方式:
- 直接查看系统头文件:在终端执行
cat /usr/include/fcntl.h,或者更精准地用grep -n "O_" /usr/include/fcntl.h,能直接看到所有以O开头的宏定义和对应的数值。 - 用C程序展开预编译宏:写一段简单的代码,编译运行就能看到具体值:
#include <fcntl.h> #include <stdio.h> int main() { printf("O_RDWR = %d\n", O_RDWR); printf("O_CREAT = %d\n", O_CREAT); printf("O_EXCL = %d\n", O_EXCL); // 可以继续添加你想查的标志 return 0; }
编译运行命令:gcc test.c -o test && ./test
- 查看man手册:执行
man 2 open,里面会列出所有oflag标志的含义,部分系统的手册还会标注对应的数值(不同操作系统可能略有差异)。
3. 补充说明
sem_open支持的oflag标志主要是O_CREAT、O_EXCL、O_NONBLOCK这些,和文件操作的oflag有重叠但不完全一致,具体细节可以查看man 3 sem_open的说明。
内容的提问来源于stack exchange,提问作者sueszli
相关产品推荐
相关产品推荐

