2015-08-22 11 views
6

Uczę się pisać moduły jądra dla Linuksa jako początkujący. Próbuję napisać każde zadanie i jego proces potomny do dziennika jądra za pomocą algorytmu DFS. Ale kiedy mogę skompilować kod za pomocą Makefile, pokazuje powyższy błąd:Deklaracja funkcji nie jest prototypem w C

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

Wskazuje ona słowa kluczowego w funkcji DFS task_struct. Oto mój kod:

# 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"); 
} 

Ktoś wie jak to naprawić ??

+0

Dlaczego _votedown_ ?? Możesz wytłumaczyć ?? –

+3

C dopuszcza 'current'. Być może jest coś w nagłówkach, które zawierasz? –

+9

W kernelu 'current' jest globalnie widoczną zmienną (wskaźnik) wskazującą bieżący wpis w tabeli procesu. – wildplasser

Odpowiedz

4

Kernal ma makro o nazwie current, które wskazuje użytkownikom aktualnie wykonującym proces. Jak This book państw,

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.

Innymi słowy, jak @GilHamilton wymienionych w komentarzach, current jest #define d do funkcji get_current() w Kernal.

Używanie current jako nazwy zmiennej spowoduje błąd podczas kompilacji !!!

+0

Um ... Jeśli "current" jest zmienną, użycie go w kodzie nie spowoduje żadnych błędów. Dlaczego miałby to robić? Chodzi o to, że 'current' nie jest zmienną, w rzeczywistości jest * makro *. – AnT

+0

@AnT Cóż, nie jestem profesjonalistą w tym. Ale zmiana nazwy zmiennej rozwiązała mój problem. Wygląda więc na to, że błąd występuje w nazwie zmiennej "current". (Czy nazwa 'current' ma cokolwiek do zrobienia w module __Kernal__?) –

+0

Na to pytanie wyraźnie odpowiedziano w komentarzu Gila Hamiltona w sierpniu 2015 r. I podziękowałeś mu za odpowiedź. W listopadzie 2015 r. Nagle dostarczyłeś własną odpowiedź, która kompletnie zignorowała (i zaprzeczyła) poprzednie informacje (?). A teraz, w 2017 r., Pytasz, czy w module jądra jest coś takiego, co nazywa się 'current'? – AnT

Powiązane problemy