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」進行檢查時,內核日誌中沒有打印出來。我究竟做錯了什麼?
正在使用的指針在內核空間中按原樣從用戶空間獲得。哎呀。你一定要使用'copy_from_user()'等。查看現有的系統調用以獲取正確的方法。更好的是,不要傳遞字符串,傳遞進程ID('pid_t')。 –
這解決了我的問題。謝謝一堆! – user3163920