是的,这是可能的。看一眼包括/uapi/asm-generic/fcntl.h http://lxr.free-electrons.com/source/include/uapi/asm-generic/fcntl.h。请注意下一条评论:
/*
* When introducing new O_* bits, please check its uniqueness in fcntl_init().
*/
现在看看fcntl_init()
函数(定义于fs/fcntl.c http://lxr.free-electrons.com/source/fs/fcntl.c#L736):
/*
* Please add new bits here to ensure allocation uniqueness.
* Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY
* is defined as O_NONBLOCK on some platforms and not on others.
*/
BUILD_BUG_ON(20 - 1 /* for O_RDONLY being 0 */ != HWEIGHT32(
O_RDONLY | O_WRONLY | O_RDWR |
O_CREAT | O_EXCL | O_NOCTTY |
O_TRUNC | O_APPEND | /* O_NONBLOCK | */
__O_SYNC | O_DSYNC | FASYNC |
O_DIRECT | O_LARGEFILE | O_DIRECTORY |
O_NOFOLLOW | O_NOATIME | O_CLOEXEC |
__FMODE_EXEC | O_PATH | __O_TMPFILE
));
因此,首先您需要为新定义找到唯一值,以便可以将其与中列出的标志进行按位或fcntl_init()
。接下来您需要将新定义添加到include/uapi/asm-generic/fcntl.h
。最后将您的新定义添加到fcntl_init()
,因此会在编译时进行检查。
最后归结为找到与现有定义不冲突的值。例如。正如我所看到的,所有 10、100、1000、10000、100000、1000000 和 10000000 都被使用。因此,对于新标志,您可以使用 100000000、200000000、400000000 和 800000000 值。
UPDATE: As 水手凯尔 https://stackoverflow.com/users/1036361/sailorcire正确提到,您还需要增加第一个数字BUILD_BUG_ON()
宏。例如,如果原来是BUILD_BUG_ON(20 - 1
,并且您要向此列表添加一个元素,您应该将其设为BUILD_BUG_ON(21 - 1
.
UPDATE 2:另一个有价值的补充水手凯尔 https://stackoverflow.com/users/1036361/sailorcire:
顺便说一句,你需要做make install_headers
,复制新的标头,看起来你需要重新编译glibc
所以它会意识到 API 的变化。