2011-11-05 24 views
3

我寫了一個系統調用,設置一個變量,我添加td_sched早些時候我怎樣才能返回比0別的東西從FreeBSD系統調用

#include <sys/param.h> 
#include <sys/proc.h> 
#include <sys/module.h> 
#include <sys/sysproto.h> 
#include <sys/sysent.h> 
#include <sys/kernel.h> 
#include <sys/systm.h> 
#include <sys/sched.h> 
#include <sys/lock.h> 
#include <sys/mutex.h> 


struct set_proc_args{ 
    pid_t pid; 
    struct timeval WCET; 
    struct timeval deadline; 
}; 

static int set_process_slack(struct thread *tda ,struct set_proc_args * arg){ 

    struct proc * process = pfind(arg->pid); 
    struct thread* td = FIRST_THREAD_IN_PROC(process); 

    if(process == NULL) 
    { 
     tda->td_retval[0] = -1; 
     return -1; 
    } 


    if(td == NULL) 
    { 
     tda->td_retval[0] = -1; 
     return -1; 
    } 
    PROC_LOCK_ASSERT(process, MA_OWNED); 
    td->td_sched->WCET = (1000000 * arg->WCET.tv_sec + arg->WCET.tv_usec); 
    td->td_sched->deadline =(uint64_t)(1000000 * arg->deadline.tv_sec+arg->deadline.tv_usec); 
    td->td_sched->slack_mode = 1; 
    PROC_UNLOCK(process); 
    return 0; 
} 

所以我想返回-1時,這個過程沒有ID被發現。 我測試過,看到代碼正在工作,當發現進程 ,但如果它沒有找到FreeBSD重新啓動 問題在哪裏? 其實我不知道如何正確返回-1。

回答

2

我願意打賭我辛苦賺來的錢,這是因爲這樣:

struct proc * process = pfind(arg->pid); 
struct thread* td = FIRST_THREAD_IN_PROC(process); 
if(process == NULL) { 
    tda->td_retval[0] = -1; 
    return -1; 
} 

在不存在這樣的進程的情況下,pfind將已經返回NULL作爲每manpage

pfind() and zpfind() return a pointer to a proc structure on success and a NULL on failure.

FIRST_THREAD_IN_PROC功能或宏然後幾乎司考y試圖取消引用process以找到它的第一個線程。

由於process爲NULL,取消引用將導致核心轉儲。或者,更準確的說,如果你只是作爲一個正常的進程運行,那麼內核就可以拋出,將會產生核心轉儲

事實上,這是一個系統調用是嚴重得多,因此重新啓動。您必須是遠的在內核級代碼中比用戶級代碼更無bug。這樣你前檢查process空值嘗試使用它

嘗試重新安排上面的代碼,類似:

struct proc * process = pfind(arg->pid); 
struct thread* td; 
if(process == NULL) { 
    tda->td_retval[0] = -1; 
    return -1; 
} 
td = FIRST_THREAD_IN_PROC(process); 
+0

感謝,這是它:) – po0ya

相關問題