Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 强制转换和复制用户宏_C_Casting_Linux Kernel - Fatal编程技术网

C 强制转换和复制用户宏

C 强制转换和复制用户宏,c,casting,linux-kernel,C,Casting,Linux Kernel,我需要将内核空间中的curr\u task->pid,一个pid\u t,复制到用户空间中的一个结构字段,该字段有很长的空间。由于这是一个不断扩大的转换,我不期待任何问题 然而,我得到了一个恼人的编译器警告(copy\u long\u to\u user与copy\u to\u user)完全相同: 这是我可以安全忽略的警告吗(编译器会为我执行强制转换吗)?如果我需要显式地将curr\u task->pid转换为long,那么如何在使用copy\u to\u user的上下文中执行该操作?我的猜

我需要将内核空间中的
curr\u task->pid
,一个
pid\u t
,复制到用户空间中的一个结构字段,该字段有很长的空间。由于这是一个不断扩大的转换,我不期待任何问题

然而,我得到了一个恼人的编译器警告(
copy\u long\u to\u user
copy\u to\u user
)完全相同:


这是我可以安全忽略的警告吗(编译器会为我执行强制转换吗)?如果我需要显式地将
curr\u task->pid
转换为long,那么如何在使用
copy\u to\u user
的上下文中执行该操作?我的猜测是这样的:
(将长数组复制到用户(&info\u数组[num\u filled\u kernel].pid,&((长)curr\u task->pid))

您需要一个助手变量来正确执行此操作

long curr_pid = curr_task->pid;
copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_pid);

获取助手变量的地址是合法的,而临时(由cast生成)的地址则不是。要正确执行此操作,您需要一个助手变量

long curr_pid = curr_task->pid;
copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_pid);

获取helper变量的地址是合法的,而临时(由强制转换生成)的地址则不是。在Linux内核中,pid的类型等于int,因此编译器警告您,
int*
不能强制转换为
long int*
。 我不知道你是如何实现你的
copy\u long\u to\u user
功能的,如果你这样写,你可能会得到错误的结果。

将_long_复制到_用户(long int*dest,long int*src){
复制到用户(dest、src、sizeof(long int));
......
}
因为
sizeof(long)
=
sizeof(int)
,如果
sizeof(long)
sizeof(int)
,支持
sizeof(long)==8
,并且
sizeof(int)总是4
,您将得到错误的结果,因为
当前任务-/pid
只占用
dest
的4字节,但
将U复制到用户(dest,src,sizeof(long int))
必须将8个字节复制到dest,因此
current->pid
后面的4个字节被复制到
dest
,因此
dest
不能等于
current->pid
。 因此,您最好编写一个名为
copy\u pid\u to\u user
的函数,其代码如下:

将\u pid\u复制到\u用户(长int*dest,void*src){
复制到用户(dest、src、sizeof(curent->pid))
......

在Linux内核中,pid的类型等于int,因此编译器警告您,
int*
不能强制转换为
long int*
。 我不知道你是如何实现你的
copy\u long\u to\u user
功能的,如果你这样写,你可能会得到错误的结果。

将_long_复制到_用户(long int*dest,long int*src){
复制到用户(dest、src、sizeof(long int));
......
}
因为
sizeof(long)
=
sizeof(int)
,如果
sizeof(long)
sizeof(int)
,支持
sizeof(long)==8
,并且
sizeof(int)总是4
,您将得到错误的结果,因为
当前任务-/pid
只占用
dest
的4字节,但
将U复制到用户(dest,src,sizeof(long int))
必须将8个字节复制到dest,因此
current->pid
后面的4个字节被复制到
dest
,因此
dest
不能等于
current->pid
。 因此,您最好编写一个名为
copy\u pid\u to\u user
的函数,其代码如下:

将\u pid\u复制到\u用户(长int*dest,void*src){
复制到用户(dest、src、sizeof(curent->pid))
......

我希望您不要只是参与@ChunleiMa的部分回答,并将
的第二个参数的类型复制到\u long\u用户()<代码>空> *>代码>不,答案让我意识到我做错了什么——我告诉《代码> CopyToToSuffux/Cuth>在源位置只有4字节的数据时复制8字节。我想也许像我提到的快捷方式可能是导致你的另一个相关问题:我希望你不只是接受PAR。@ChunleiMa答案的t,并将
copy\u long\u的第二个参数的类型复制到\u user()
a
void*
。不,这个答案让我意识到我做错了什么——我告诉
copy\u to\u user
复制8个字节,而源位置只有4个字节的数据。我想,也许我提到的一个快捷方式可能是导致其他相关问题的原因: