1

可能重复:
带负值的无符号长整数

我编写了一个内核模块,它中断任何系统调用,打印其当前的 user_id 和传递给系统调用函数的输入参数。其中,一个是 sys_ioctl(),如下:

asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd,unsigned long arg);

这意味着所有输入参数都是无符号整数。

但是当我打印输入参数时,我得到以下输出:

 fd=21, cmd=-1072143871 and arg=3202983648 
 fd=21, cmd=-1072143871 and arg=3202983648 
 fd=21, cmd=-1072143871 and arg=3202983648 
 ----------

这是我的函数定义:

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);
}

知道为什么 cmd 值为负数以及这些值是什么意思吗?

4

2 回答 2

5

当您使用%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);
                                                    ^^^^
于 2013-01-06T11:40:15.110 回答
3

您 print 使用%iwhich 将参数转换为带符号的 int。用 打印%u

于 2013-01-06T11:41:35.780 回答