2015-08-22 8 views
6

Sto imparando a scrivere i moduli del kernel per linux come principiante. Quello che sto cercando di fare è scrivere ogni attività e il suo processo figlio nel log del kernel usando l'algoritmo DFS. Ma quando compilo il codice utilizzando Makefile, mostra l'errore di cui sopra:La dichiarazione di funzione non è un prototipo in C

function declaration isn’t a prototype [-Werror=strict-prototypes] 
struct task_struct *current; 

Essa sottolinea la parola task_struct alla funzione DFS. Ecco il mio codice:

# include <linux/init.h> 
# include <linux/kernel.h> 
# include <linux/module.h> 
# include <linux/sched.h> 
# include <linux/list.h> 

void DFS (struct task_struct *task) 
{ 
    struct task_struct *current; 
    struct list_head *list; 

    list_for_each (list, &task->children) 
    { 
     current = list_entry(list, struct task_struct, sibling); 
     printk(KERN_INFO "%d\t%d\t%s \n", (int)current->state, current->pid, current->comm); 

     if (current != NULL) 
     { 
      DFS(current); 
     } 
    } 
} 

int DFS_init(void) 
{ 
    printk(KERN_INFO "Loading the Second Module...\n"); 

    printk(KERN_INFO "State\tPID\tName\n"); 

    DFS(&init_task); 

    return 0; 
} 

void DFS_exit(void) 
{ 
    printk(KERN_INFO "Removing the Second Module...\n"); 
} 

Qualcuno sa come risolvere questo problema ??

+0

Perché _votedown_ ?? Puoi spiegare ?? –

+3

C consente 'corrente'. Forse c'è qualcosa nelle intestazioni che hai incluso? –

+9

Nel kernel, 'current' è una variabile visibile globalmente (puntatore) che punta alla voce della tabella del processo corrente. – wildplasser

risposta

4

Kernal ha una macro denominata current che punta agli utenti che stanno attualmente eseguendo il processo. Come This book stati,

The current pointer refers to the user process currently executing. During the execution of a system call, such as open or read, the current process is the one that invoked the call.

In altre parole, come @GilHamilton menzionato nei commenti, current è #define d alla funzione get_current() nel Kernel.

Quindi, usare current come nome di variabile darà un errore in fase di compilazione !!!

+0

Um ... Se 'current' fosse una variabile, utilizzarla nel proprio codice non comporterebbe alcun errore. Perché dovrebbe? L'intero punto qui è che 'current' non è una variabile, in realtà è una * macro *. – AnT

+0

@AnT Beh, non sono un professionista in questo. Ma rinominare il nome della variabile ha risolto il mio problema. Quindi sembra che l'errore sia nel nome della variabile, 'current'. (Il nome 'current' ha qualcosa da fare in un __Kernal Module__?) –

+0

La domanda è stata chiaramente risposta nei commenti di Gil Hamilton nell'agosto del 2015 e tu lo hai ringraziato per la risposta. A novembre 2015 improvvisamente hai fornito la tua risposta che ha completamente ignorato (e contraddetto) quell'informazione precedente (?). E ora, nel 2017, stai chiedendo se c'è qualche cosa chiamato 'corrente' nel modulo del kernel ??? – AnT