2015-08-22 21 views
6

modelinde bir prototip değildir. Linux için çekirdek modülleri başlangıç ​​olarak yazmayı öğreniyorum. Yapmaya çalıştığım şey, DFS algoritmasını kullanarak her görevi ve alt işlemini çekirdek günlüğüne yazmaktır. Ben Makefile kullanarak kodu derlemek Fakat, yukarıdaki hata gösterir:İşlev bildirimi, C

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

Bu işlevi DFS de task_struct anahtar kelimeyi işaret ediyor. İşte benim 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"); 
} 

Herkes bunu düzeltmek nasıl bilir ??

+0

Neden _votedown_ ?? Açıklayabilir misin ?? –

+3

C, "akımı" izin vermez. Belki de dahil ettiğiniz başlıklarda bir şey var mı? –

+9

Çekirdekte, "current" geçerli işlem tablosu girişine işaret eden global olarak görülebilir bir değişken (işaretçi). – wildplasser

cevap

4

Kernal, şu anda yürütme işlemini gerçekleştiren kullanıcılara işaret eden current adlı bir makroya sahiptir. @GilHamilton yorumlar belirtildiği gibi This book durumları, diğer bir deyişle

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.

olarak, current Kernal fonksiyon get_current()-#define d.

current değişken adı olarak kullanmak, derleme zamanı hatası verir!

+0

Um ... Eğer 'current' bir değişken olsaydı, kodunuzda kullanmak hataya yol açmazdı. Neden olsun Buradaki bütün nokta 'current'ın bir değişken değil, aslında bir * makro * olmasıdır. – AnT

+0

@AnT Bu konuda profesyonel değilim. Ama değişken ismini değiştirmek benim problemimi çözdü. Yani hata, değişken adı olan "current" durumunda görünüyor. ('Current' adı bir __Kernal Module__ içinde yapacak bir şey var mı?) –

+0

Soru, 2015 yılının ağustos ayında Gil Hamilton tarafından yapılan yorumlarda açıkça yanıtlandı ve cevap için ona teşekkür ettiniz. Kasım 2015'te aniden kendi cevabınızı sağladıktan sonra, önceki bilgilerin (?) Yok sayılmasını (ve çeliştiğini) tamamladınız. Ve şimdi, 2017 yılında, çekirdek modülünde 'current' adında bir şey var mı diye soruyorsunuz ??? – AnT