我需要向设备驱动程序的open()
调用传递一些自定义标志。
我在LDD3中找到了以下示例:
int dev_open(struct inode *inode, struct file *filp)
{
if ((filp->f_flags & O_ACCMODE) == O_WRONLY) {
...
}
}
我的问题是:是否可以定义其他标志(例如O_ACCMODE
和O_WRONLY
)而不会与任何其他标志冲突?
我需要向设备驱动程序的open()
调用传递一些自定义标志。
我在LDD3中找到了以下示例:
int dev_open(struct inode *inode, struct file *filp)
{
if ((filp->f_flags & O_ACCMODE) == O_WRONLY) {
...
}
}
我的问题是:是否可以定义其他标志(例如O_ACCMODE
和O_WRONLY
)而不会与任何其他标志冲突?
是的,这是可能的。请查看include/uapi/asm-generic/fcntl.h。注意下一个注释:
/*
* When introducing new O_* bits, please check its uniqueness in fcntl_init().
*/
fcntl_init()
函数(定义在fs/fcntl.c中):/*
* 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()
中,以便在编译时进行检查。BUILD_BUG_ON()
宏中的第一个数字。例如,如果它最初是BUILD_BUG_ON(20-1
,并且您要向此列表添加一个元素,则应使其为BUILD_BUG_ON(21-1
。
更新2: 另一个有价值的补充来自SailorCaire:
顺便提一下,您需要执行
make install_headers
,复制新的头文件,看起来您需要重新编译glibc
,以使其意识到API的更改。
20 - 1
,而应该是22 - 1
?另外,你为O_CLASSIFY
分配的数字是多少?顺便说一下,你可以使用 这个 提交作为你任务的模板。 - Sam Protsenko<bits/fcntl-linux.h>
中提取的。你可以重新编译内核,然后修改<bits/fcntl-linux.h>
;但是,当有新版本的glibc时,你的软件包管理器会将其覆盖掉。我建议在/usr/local/
安装一个新版本以避免这种情况。 - SailorCire