2015-04-10 2 views
2

Я очень новичок в кодировании ядра. Поэтому, пожалуйста, извините меня, я задаю очень вопрос свалитьКак получить доступ к некоторой информации о текущем процессе в ядре linux

Я пытаюсь получить всю информацию о текущем запуске процесса в ядре linux. Вот что я пробовал:

#include <linux/kernel.h> 
#include <linux/uaccess.h> 
#include <linux/module.h> 
#include <linux/sched.h> 
#include "process_ancestors.h" 

asmlinkage long sys_prs_anc(int arg){ 
    //int counter = 0; 
    long pid; 
    char *process_name; 
    long process_state; 
    long process_owner_uid; 
    long voluntary_context_switches; 
    long involuntary_context_switches; 
    long num_children; 
    long num_siblings; 
    struct list_head *pos; 

    num_children = 0; 
    num_siblings = 0; 
    struct list_head children_list; 
    struct list_head siblings_list; 
    pid = current->pid; 
    process_name = current->comm; 
    process_state=current->state; 
    process_owner_uid = (current->cred)->uid; 
    children_list = current->children; 
    siblings_list = current->sibling; 
    voluntary_context_switches = current->nivcsw; 
    involuntary_context_switches = current->nvcsw; 

    list_for_each(pos, &children_list){ 
     num_children ++; 
    } 
    list_for_each(pos, &siblings_list){ 
     num_siblings ++; 
    } 

    return 0; 
} 

и я получаю следующее сообщение об ошибке, когда я построить его?

CHK  include/config/kernel.release 
    CHK  include/generated/uapi/linux/version.h 
    CHK  include/generated/utsrelease.h 
    CALL scripts/checksyscalls.sh 
    CHK  include/generated/compile.h 
    CC  cs300/process_ancestors.o 
cs300/process_ancestors.c: In function ‘sys_process_ancestors’: 
cs300/process_ancestors.c:21:2: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] 
    struct list_head children_list; 
^
cs300/process_ancestors.c:26:6: error: incompatible types when assigning to type ‘long int’ from type ‘kuid_t’ 
    uid = (current->cred)->uid; 
    ^
make[1]: *** [cs300/process_ancestors.o] Error 1 
make: *** [cs300] Error 2 

Может ли кто-нибудь дать мне несколько советов, что я делаю неправильно?

ответ

2

UID имеет тип kuid_t

typedef struct { 
    uid_t val; 
} kuid_t; 

вы должны использовать process_owner_uid = (current->cred)->uid.val;

+0

... а также он должен использовать 'uid_t' тип для его' process_owner_uid' переменной. Потому что 'uid_t' является' unsigned int', и он использует тип 'long', который подписан (и может даже иметь другой размер, который' int'). –

Смежные вопросы