C linux终端中指向不完整类型的解引用指针

C linux终端中指向不完整类型的解引用指针,c,linux,pointers,kernel,system-calls,C,Linux,Pointers,Kernel,System Calls,因此,我正试图在Red Hat 2.4.20中为我一直在从事的一个项目进行一个新的系统调用。对于这个例子,我已经创建了一个C文件来尝试系统调用是否有效,并且我已经收到了相同的错误,将指针解引用到imcomplete类型,已经好几天了。我的头文件在这里: struct prcdata { long counter; /* process counter value */ long nice; /* process nice value */ long prio; /* calculated

因此,我正试图在Red Hat 2.4.20中为我一直在从事的一个项目进行一个新的系统调用。对于这个例子,我已经创建了一个C文件来尝试系统调用是否有效,并且我已经收到了相同的错误,将指针解引用到imcomplete类型,已经好几天了。我的头文件在这里:

    struct prcdata {
long counter; /* process counter value */
long nice; /* process nice value */
long prio; /* calculated with 20- processes’ nice value */
long weight; /* calculated with 20-nice+counter */
pid_t pid; /* process id */
long uid; /* user id of process owner */
int nofprocess; /* number of process of owner of current process
*/}
;
我的系统调用的C文件如下

#include <linux/mysyscall.h>
asmlinkage int cprocinf(struct prcdata *data)
{
    cli();
    struct prcdata temp;
    copy_from_user(&temp,data,sizeof(struct prcdata));
    temp.prio=20-current->nice;
    temp.weight=current->counter + temp.prio;
    temp.rank=2*current->nice;
    temp.pid=current->pid;
    temp.uid=current->uid;
    temp.processcount=current->user->proccesses.counter;
    copy_to_user(data,&temp,sizeof(struct prcdata));
    return 0;
    sti();

}
#include <linux/mysyscall.h>
#include <stdio.h>
main(){
int ret;
struct prcdata *data; 
ret=mysyscall(data);
printf("First values of process\n");
printf("Nice Value. %d\nPriority: %d\n", -data->prio+20,data->prio);
printf("Weight: %d\n", data->weight);
printf("Rank: %d\nPid: %d\nPid: %d\nParent: %d\nProcess Count: %d\n",data->rank,data->pid,data->pidparent,data->processcount);
}
#包括
ASMINT cprocinf(结构prcdata*数据)
{
cli();
结构prcdatatemp;
从用户(临时、数据、sizeof(struct prcdata))复制\u;
温度prio=20电流->良好;
温度重量=当前->计数器+温度优先级;
温度等级=2*当前->良好;
温度pid=当前->pid;
温度uid=当前->uid;
临时进程计数=当前->用户->进程计数器;
将\复制到\用户(数据、&temp、sizeof(struct prcdata));
返回0;
sti();
}
尝试此代码的文件如下所示

#include <linux/mysyscall.h>
asmlinkage int cprocinf(struct prcdata *data)
{
    cli();
    struct prcdata temp;
    copy_from_user(&temp,data,sizeof(struct prcdata));
    temp.prio=20-current->nice;
    temp.weight=current->counter + temp.prio;
    temp.rank=2*current->nice;
    temp.pid=current->pid;
    temp.uid=current->uid;
    temp.processcount=current->user->proccesses.counter;
    copy_to_user(data,&temp,sizeof(struct prcdata));
    return 0;
    sti();

}
#include <linux/mysyscall.h>
#include <stdio.h>
main(){
int ret;
struct prcdata *data; 
ret=mysyscall(data);
printf("First values of process\n");
printf("Nice Value. %d\nPriority: %d\n", -data->prio+20,data->prio);
printf("Weight: %d\n", data->weight);
printf("Rank: %d\nPid: %d\nPid: %d\nParent: %d\nProcess Count: %d\n",data->rank,data->pid,data->pidparent,data->processcount);
}
#包括
#包括
main(){
int ret;
结构prcdata*数据;
ret=mysyscall(数据);
printf(“过程的第一个值”);
printf(“很好的值。%d\n优先级:%d\n”,-data->prio+20,data->prio);
printf(“重量:%d\n”,数据->重量);
printf(“排名:%d\nPid:%d\nPid:%d\n租金:%d\n进程计数:%d\n”,数据->排名,数据->pid,数据->pid父级,数据->进程计数);
}
我做错了什么

copy_from_user(&temp,arg1,sizeof(struct prcdata));
....
copy_to_user(arg1,&temp,sizeof(struct prcdata));
应该是

copy_from_user(&temp,data,sizeof(struct prcdata));
....
copy_to_user(data,&temp,sizeof(struct prcdata));
在这里,您需要初始化指针或传递本地对象:

main()
{
    int ret;
    struct prcdata data; 
    ret=mysyscall(&data);
    ...
}


您正在传递一个未初始化的指针,指向
mysycall
。而
arg1
在哪里定义?