1

重複の可能性:
負の値のunsigned long

システムコールを中断し、現在のuser_idとシステムコール関数に渡された入力パラメーターを出力するカーネルモジュールを1つ作成しました。その中には、次のような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印刷に使用する場合は、@Marioが以前に推測したようcmd にキャストします。signed intこれがネガティブな理由です。

あなた%uはそれが残るために印刷を行うために使用する必要がありますunsigned int

dまたはi-符号付き10進整数

u-符号なし10進整数

(from: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

%i引数をsignedintに変換するために印刷します。で印刷し%uます。

于 2013-01-06T11:41:35.780 に答える