signal: add basic signals

This commit is contained in:
Lephenixnoir 2021-05-30 10:51:52 +02:00
parent f5e55ecc22
commit 40349e99b7
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
4 changed files with 54 additions and 1 deletions

View File

@ -31,6 +31,8 @@ set(SOURCES
src/setjmp/interrupt.c
src/setjmp/massive.c
src/setjmp/simple.c
# signal
src/signal/signal.c
# stdlib
src/stdlib/arith.c
src/stdlib/fpconv.c

View File

@ -20,6 +20,9 @@ extern ft_test ft_setjmp_simple;
extern ft_test ft_setjmp_massive;
extern ft_test ft_setjmp_interrupt;
/* signal */
extern ft_test ft_signal_signal;
/* stdlib */
extern ft_test ft_stdlib_arith;
extern ft_test ft_stdlib_sizes;

View File

@ -34,7 +34,10 @@ ft_list headers_libc[] = {
&ft_setjmp_interrupt,
NULL,
}},
{ "<signal.h>", NULL },
{ "<signal.h>", (ft_test*[]){
&ft_signal_signal,
NULL,
}},
{ "<stdio.h>", NULL },
{ "<stdlib.h>", (ft_test*[]){
&ft_stdlib_arith,

45
src/signal/signal.c Normal file
View File

@ -0,0 +1,45 @@
#include <ft/test.h>
#include <ft/all-tests.h>
#include <signal.h>
#include <setjmp.h>
static volatile sig_atomic_t last_signum = 0;
static jmp_buf jb;
void handler(int signum)
{
last_signum = signum;
}
void handler2(int signum)
{
longjmp(jb, signum);
}
void _ft_signal_signal(ft_test *t)
{
__sighandler_t prev;
ft_assert(t, signal(192548, SIG_IGN) == SIG_ERR);
signal(SIGINT, SIG_DFL);
/* Call an ignored signal */
prev = signal(SIGINT, SIG_IGN);
ft_assert(t, prev == SIG_DFL && raise(SIGINT) == 0);
/* Call a normal handler */
prev = signal(SIGINT, handler);
raise(SIGINT);
ft_assert(t, prev == SIG_IGN && last_signum == SIGINT);
/* longjmp() out of a signal handler (same thread) */
signal(SIGINT, handler2);
int rc = setjmp(jb);
if(!rc) raise(SIGINT);
else ft_assert(t, rc == SIGINT);
}
ft_test ft_signal_signal = {
.name = "Signal basics",
.function = _ft_signal_signal,
};