如何从FreeBSD系统调用中返回0以外的其他内容

时间:2011-11-05 06:30:55

标签: kernel return-value freebsd system-calls

我编写了一个系统调用,用于设置我之前添加的td_sched中的变量

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

所以当没有找到具有此ID的进程时,我想返回-1。 我已经测试并发现代码在找到进程时正在运行 但如果没有找到FreeBSD重新启动 问题出在哪儿? 其实我不知道如何正确地返回-1。

1 个答案:

答案 0 :(得分: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将根据manpage返回NULL:

  

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

FIRST_THREAD_IN_PROC函数或宏几乎肯定会尝试取消引用process来找到它的第一个线程。

因为process为NULL,所以取消引用将导致核心转储。或者,更准确地说,如果您只是作为内核可能抛弃的正常进程运行,导致核心转储。

这是在系统调用中的事实要严重得多,因此重新启动。你必须在内核级代码中比用户级代码更无错误。

尝试重新安排上面的代码,以便在尝试使用之前检查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);