kernel: add sigsuspend

This commit is contained in:
K. Lange 2022-08-18 15:09:23 +09:00
parent ab4c474768
commit 37bd4e08cb
6 changed files with 50 additions and 0 deletions

24
apps/test-sigsuspend.c Normal file
View File

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

View File

@ -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

View File

@ -76,3 +76,4 @@
#define SYS_SIGACTION 73
#define SYS_SIGPENDING 74
#define SYS_SIGPROCMASK 75
#define SYS_SIGSUSPEND 76

View File

@ -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,

View File

@ -1,3 +1,4 @@
#include <signal.h>
#include <sys/signal.h>
#include <syscall.h>
#include <syscall_nums.h>

17
libc/signal/sigsuspend.c Normal file
View File

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