【发布时间】:2016-04-16 00:19:47
【问题描述】:
我需要将curr_task->pid(内核空间中的pid_t)复制到用户空间中具有很长空间的结构字段。由于这是一个不断扩大的转换,我预计不会有任何问题。
但是,我收到了一个烦人的编译器警告(copy_long_to_user 的所有意图和目的都与copy_to_user 相同):
cs300/process_ancestors.c:31:3: warning: passing argument 2 of ‘copy_long_to_user’ from incompatible pointer type [enabled by default]
if(copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_task->pid)) {
^
cs300/process_ancestors.c:9:5: note: expected ‘long int *’ but argument is of type ‘pid_t *’
这个警告是我可以放心忽略的吗(编译器会为我做转换)吗?如果我需要明确地将 curr_task->pid 转换为 long,我该如何在使用 copy_to_user 的情况下做到这一点?我的猜测是:(copy_long_to_user(&info_array[num_filled_kernel].pid, &((long)curr_task->pid)))
【问题讨论】:
-
希望你不要只参与@ChunleiMa的回答,将
copy_long_to_user()的第二个参数的类型设为void*。 -
不,答案让我意识到我做错了什么——我告诉
copy_to_user在源位置只有 4 个字节的数据时复制 8 个字节。 -
我认为也许像我提到的捷径可能是导致您其他相关问题的原因:stackoverflow.com/questions/36658863/…
标签: c casting linux-kernel