|
CS471/571 - Operating Systems
|
Displaying ./code/xv6-public/signal.c
#include "types.h"
#include "defs.h"
#include "param.h"
#include "memlayout.h"
#include "mmu.h"
#include "x86.h"
#include "proc.h"
#include "spinlock.h"
#include "signal.h"
int defdisposition[MAXSIG+1] = { DIS_IGNORE, DIS_TERM, DIS_IGNORE, DIS_TERM, DIS_IGNORE, DIS_TERM};
// pid, signal#
int sys_sigqueue(void)
{
int pid, signum;
if (argint(0, &pid) < 0) return -1;
if (argint(1, &signum) < 0) return -1;
if (signum < 1 || signum > MAXSIG) return -1;
return sigqueue(pid, signum);
}
int sys_signal(void)
{
int sig;
uint addr;
if (argint(0, &sig) < 0) return -1;
if (sig < 1 || sig > MAXSIG) return -1;
if (sig == SIGKILL) return 0;
if (argint(1, (int *)&addr) < 0) return -1;
myproc()->sighandler[sig] = (uint)addr;
return 0;
}
int sys_sigreturn(void)
{
struct proc *p = myproc();
if (p == 0) return -1;
if (p->inhandler == 0) return -1;
memmove(p->tf, p->savedtf, sizeof(struct trapframe));
p->inhandler = 0;
return 0;
}
|