From 48ea61ab9c369ab643b0909a5f5873b2b3c26bb7 Mon Sep 17 00:00:00 2001 From: Giacomo Tesio Date: Mon, 8 May 2017 00:36:04 +0200 Subject: [PATCH] newlib: more tests for signals --- qa/lib/newlib/202-signals.c | 55 ++++++++++++++++++++++++++++ qa/lib/newlib/203-signals.c | 73 +++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 qa/lib/newlib/202-signals.c create mode 100644 qa/lib/newlib/203-signals.c diff --git a/qa/lib/newlib/202-signals.c b/qa/lib/newlib/202-signals.c new file mode 100644 index 0000000..eee052a --- /dev/null +++ b/qa/lib/newlib/202-signals.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include + +void sigcont() { + printf("CHILD: Got SIGCONT\n"); + exit(0); +} + +int +main() { + int pid, p[2], child, cstatus; + char dummy[1]; + + /* get child process */ + + if(pipe(p)){ + perror("pipe"); + exit(1); + } + if ((pid = fork()) < 0) { + perror("fork"); + exit(2); + } + + if (pid == 0) { + signal(SIGCONT,sigcont); /* set function calls */ + printf("Child going to loop...\n"); + close(p[1]); + close(p[0]); + for(;;); /* loop for ever */ + } + else /* parent */ + { + close(p[1]); + if(read(p[0], &dummy, 1) > 0){ + printf("sync read received data"); + exit(EXIT_FAILURE); + } + close(p[0]); + printf("PARENT: sending SIGCONT\n\n"); + kill(pid,SIGCONT); + child = wait(&cstatus); + if(child == pid && cstatus == 0) + exit(0); + else + { + printf("PARENT: child exited with status %d\n", cstatus); + exit(1); + } + } +} + diff --git a/qa/lib/newlib/203-signals.c b/qa/lib/newlib/203-signals.c new file mode 100644 index 0000000..9d81e9e --- /dev/null +++ b/qa/lib/newlib/203-signals.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include + +void sigcont() { + signal(SIGCONT,sigcont); /* reset signal */ + printf("CHILD: Got SIGCONT\n"); + exit(0); +} + +void sigstop() { + signal(SIGSTOP,sigstop); /* reset signal */ + printf("CHILD: Got SIGSTOP\n"); + exit(1); +} + +int +main() { + int pid, p[2], child, cstatus; + char dummy[1]; + + /* get child process */ + + if(pipe(p)){ + perror("pipe"); + exit(1); + } + if ((pid = fork()) < 0) { + perror("fork"); + exit(2); + } + + if (pid == 0) { + signal(SIGCONT,sigcont); /* set function calls */ + signal(SIGSTOP,sigstop); /* set function calls */ + printf("Child going to loop...\n"); + close(p[1]); + close(p[0]); + for(;;){ + /* loop for ever */ + printf("."); + usleep(1000); + } + } + else /* parent */ + { + close(p[1]); + if(read(p[0], &dummy, 1) > 0){ + printf("sync read received data"); + exit(EXIT_FAILURE); + } + close(p[0]); + sleep(2); + printf("PARENT: sending SIGSTOP\n"); + kill(pid,SIGSTOP); + sleep(4); + + printf("PARENT: sending SIGCONT\n"); + kill(pid,SIGCONT); + + child = wait(&cstatus); + if(child == pid && cstatus == 0) + exit(0); + else + { + printf("PARENT: child exited with status %d\n", cstatus); + exit(1); + } + } +} +