2016-11-04 68 views
4

我開發了一個自定義系統調用來記錄死亡進程。 C程序會終止進程,並調用自定義系統調用,傳遞被終止進程的進程ID,然後系統調用會將被終止進程的ID輸出到內核日誌中。在這裏,我只是傳遞一個虛擬來測試系統調用是否寫入內核日誌。系統調用的系統調用表號爲329將參數傳遞給自定義系統調用

下面是我的系統調用

#include <linux/kernel.h> 


asmlinkage long sys_killa(char* proc_id) 
{ 

    printk("The process %s has been killed", proc_id); 

    return 0; 
} 

這是我的C程序中調用系統調用。

#include <stdio.h> 
#include <linux/kernel.h> 
#include <sys/syscall.h> 
#include <unistd.h> 

int main() 
{ 
    char proc_id[5] = "3219"; 
    long int sys = syscall(329, proc_id); 
    printf("System call sys_killa returned %ld\n", sys); 
    return 0; 
} 

運行C程序只是在終端打印「Killed」。再次運行該程序會使我的虛擬機崩潰。當我使用「dmesg」進行檢查時,內核日誌中沒有打印出來。我究竟做錯了什麼?

+1

正在使用的指針在內核空間中按原樣從用戶空間獲得。哎呀。你一定要使用'copy_from_user()'等。查看現有的系統調用以獲取正確的方法。更好的是,不要傳遞字符串,傳遞進程ID('pid_t')。 –

+0

這解決了我的問題。謝謝一堆! – user3163920

回答

2

需要使用將爲pid_t變量,而不是String.This是修改的系統調用:

#include <linux/kernel.h> 

asmlinkage long sys_killa(pid_t pid) 
{ 
    long pid_l = (long) pid; 

    printk("The process %ld has been killed", pid_l); 

    return 0; 

} 

這是修改後的C代碼使用系統調用:

#include <stdio.h> 
#include <linux/kernel.h> 
#include <sys/syscall.h> 
#include <unistd.h> 

int main() 
{ 
    pid_t pid = 3249; 
    long int sys = syscall(329, pid); 
    printf("System call sys_killa returned %ld\n", sys); 
    return 0; 
} 
相關問題