为什么printf显示unsigned int的负值?

时间:2013-01-06 11:36:16

标签: c linux linux-kernel system-calls

  

可能重复:
  Unsigned long with negative value

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

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

表示所有输入参数都是无符号的int数。

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

 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值为负值以及这些值是什么意思?

2 个答案:

答案 0 :(得分: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);
                                                    ^^^^

答案 1 :(得分:3)

使用%i进行打印,将参数转换为signed int。使用%u打印。