kernel: add sigsuspend
This commit is contained in:
parent
ab4c474768
commit
37bd4e08cb
|
@ -0,0 +1,24 @@
|
|||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
void handler(int sig) {
|
||||
fprintf(stderr, "received %d\n", sig);
|
||||
}
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
signal(SIGINT, handler);
|
||||
signal(SIGWINCH, handler);
|
||||
|
||||
sigset_t mask;
|
||||
sigemptyset(&mask);
|
||||
|
||||
while (1) {
|
||||
int result = sigsuspend(&mask);
|
||||
fprintf(stderr, "result = %d, errno = %s\n", result, strerror(errno));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -24,5 +24,6 @@ extern int sigdelset(sigset_t * set, int signum);
|
|||
extern int sigismember(sigset_t * set, int signum);
|
||||
extern int sigprocmask(int how, const sigset_t * restrict set, sigset_t * restrict oset);
|
||||
extern int sigpending(sigset_t * set);
|
||||
extern int sigsuspend(const sigset_t * restrict set);
|
||||
|
||||
_End_C_Header
|
||||
|
|
|
@ -76,3 +76,4 @@
|
|||
#define SYS_SIGACTION 73
|
||||
#define SYS_SIGPENDING 74
|
||||
#define SYS_SIGPROCMASK 75
|
||||
#define SYS_SIGSUSPEND 76
|
||||
|
|
|
@ -1008,6 +1008,11 @@ long sys_sigprocmask(int how, sigset_t *restrict set, sigset_t * restrict oset)
|
|||
return 0;
|
||||
}
|
||||
|
||||
long sys_sigsuspend_cur(void) {
|
||||
switch_task(0);
|
||||
return -EINTR;
|
||||
}
|
||||
|
||||
long sys_fswait(int c, int fds[]) {
|
||||
PTR_VALIDATE(fds);
|
||||
if (!fds) return -EFAULT;
|
||||
|
@ -1218,6 +1223,7 @@ static long (*syscalls[])() = {
|
|||
[SYS_SIGACTION] = sys_sigaction,
|
||||
[SYS_SIGPENDING] = sys_sigpending,
|
||||
[SYS_SIGPROCMASK] = sys_sigprocmask,
|
||||
[SYS_SIGSUSPEND] = sys_sigsuspend_cur,
|
||||
|
||||
[SYS_SOCKET] = net_socket,
|
||||
[SYS_SETSOCKOPT] = net_setsockopt,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include <signal.h>
|
||||
#include <sys/signal.h>
|
||||
#include <syscall.h>
|
||||
#include <syscall_nums.h>
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
#include <signal.h>
|
||||
#include <sys/signal.h>
|
||||
#include <syscall.h>
|
||||
#include <syscall_nums.h>
|
||||
#include <errno.h>
|
||||
|
||||
DEFN_SYSCALL0(sigsuspend_cur, SYS_SIGSUSPEND);
|
||||
|
||||
int sigsuspend(const sigset_t * restrict set) {
|
||||
sigset_t old;
|
||||
sigprocmask(SIG_SETMASK, set, &old);
|
||||
int ret = syscall_sigsuspend_cur();
|
||||
if (ret < 0) { errno = -ret; ret = -1; }
|
||||
sigprocmask(SIG_SETMASK, &old, NULL);
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue