2013-01-06 40 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打印。

相關問題