Jun*_*aid 1 c linux system-calls linux-kernel
可能重复:
带有负值的无符号长整数
我编写了一个内核模块,它可以中断任何系统调用,打印其当前的user_id和传递给系统调用函数的输入参数.其中一个是sys_ioctl(),如下所示:
asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd,unsigned long arg);
Run Code Online (Sandbox Code Playgroud)
这意味着所有输入参数都是无符号的int数.
但是当我打印输入参数时,我得到以下输出:
fd=21, cmd=-1072143871 and arg=3202983648
fd=21, cmd=-1072143871 and arg=3202983648
fd=21, cmd=-1072143871 and arg=3202983648
----------
Run Code Online (Sandbox Code Playgroud)
这是我的函数定义:
asmlinkage long our_sys_ioctl(unsigned int fd , unsigned int cmd , unsigned long arg)
{
uid_t gtuid ;
gtuid = getuid_call();
printk ("our_sys_ioctl ---> uid = %d with fd=%i, cmd=%i and arg=%lu \n ", gtuid, fd, cmd, arg);
return original_call_ioctl(fd , cmd , arg);
}
Run Code Online (Sandbox Code Playgroud)
知道为什么cmd值是负数,这些值是什么意思?
当您使用%i打印时,cmd 您正在将其投射到signed int @Mario之前猜到的那样.这就是为什么它是消极的.
您需要使用它%u来进行打印才能保持打印状态unsigned int
d或i - 有符号十进制整数
u - 无符号十进制整数
(来自:http://www.cplusplus.com/reference/cstdio/printf/)
这将按照您的预期工作.
printk ("our_sys_ioctl ---> uid = %d with fd=%i, cmd=%u and arg=%lu \n ", gtuid, fd, cmd, arg);
^^^^
Run Code Online (Sandbox Code Playgroud)