2013-01-06 39 views
0

可能重复:
Unsigned long with negative value为什么printf显示unsigned int的负值?

我写了一个内核模块,它会中断任何系统调用,打印传递给系统调用函数当前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值为负,并且这些值的含义?

+1

你打印的值如何? –

+1

你如何打印你的号码?也许你隐式地将它们转换为有符号整数? – Mario

+0

刚刚更新了问题 – Junaid

回答

4

当您使用%i打印cmd你正在浇铸成signed int作为@Mario先前猜测。这就是为什么它是负面的。

您需要使用%u做印刷为它仍然是一个unsigned int

d或I - 符号十进制整数

ü - 无符号十进制整数

(来源: 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); 
                ^^^^ 
3

%i打印,它将参数转换为带符号的int。用%u打印。

相关问题