我需要将一些自定义标记传递给设备驱动程序的open()
调用。
我在LDD3中找到了这个例子:
int dev_open(struct inode *inode, struct file *filp)
{
if ((filp->f_flags & O_ACCMODE) == O_WRONLY) {
...
}
}
我的问题是:是否可以定义其他标志(如O_ACCMODE
和O_WRONLY
)而不与其他标志冲突?
答案 0 :(得分:3)
是的,这是可能的。看看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()
,以便在编译时进行检查。
最后归结为找到与现有定义不冲突的价值。例如。我可以看到所有10,100,1000,10000,100000,1000000和10000000都被使用。因此,对于新标记,您可以使用100000000,200000000,4000000和800000000值。
更新:正确提及SailorCaire,您还需要在BUILD_BUG_ON()
宏中增加第一个数字。例如,如果它最初是BUILD_BUG_ON(20 - 1
,并且您要在此列表中添加一个元素,则应将其设为BUILD_BUG_ON(21 - 1
。
更新2 :来自SailorCaire的另一个有价值的补充:
顺便说一句,您需要执行
make install_headers
,复制新标头,看起来您需要重新编译glibc
,以便它了解API变化