jehanne/qa/lib/newlib/203-signals.c

80 lines
1.2 KiB
C
Raw Normal View History

2017-05-08 00:36:04 +02:00
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
2017-05-26 00:39:47 +02:00
int p[2];
2017-05-08 00:36:04 +02:00
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);
}
2017-05-26 00:39:47 +02:00
void childloop(void)
{
signal(SIGCONT,sigcont); /* set function calls */
signal(SIGSTOP,sigstop); /* set function calls */
printf("Child %d going to loop...\n", getpid());
write(p[1], "", 1);
2017-05-26 00:39:47 +02:00
close(p[1]);
close(p[0]);
for(;;){
/* loop for ever */
printf(".");
usleep(500);
}
exit(0);
}
2017-05-08 00:36:04 +02:00
int
main() {
2017-05-26 00:39:47 +02:00
int pid, child, cstatus;
2017-05-08 00:36:04 +02:00
char dummy[1];
/* get child process */
if(pipe(p)){
perror("pipe");
exit(1);
}
if ((pid = fork()) < 0) {
perror("fork");
exit(2);
}
if (pid == 0) {
2017-05-26 00:39:47 +02:00
childloop();
2017-05-08 00:36:04 +02:00
}
else /* parent */
{
read(p[0], &dummy, 1);
2017-05-08 00:36:04 +02:00
close(p[1]);
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);
}
}
}