Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <signal.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/wait.h>
- int p[2];//pipe
- void sigHandler (int sig) {
- char c;
- switch (sig) {
- case SIGUSR1:
- c = '1';
- break;
- case SIGUSR2:
- c = '2';
- break;
- case SIGALRM:
- c = '0';
- break;
- case SIGSTOP:
- exit (0);
- break;
- }
- write(p[1], &c, sizeof(char));
- }
- int main(int argc, char **argv) {
- int signals[3], sig, i;
- for (i=0; i< 3; i++) {
- signals[i] =0;
- }
- pid_t pid;
- char csig;
- pipe(p);
- /*fork code*/
- pid = fork();
- /*parent*/
- if (pid) {
- close(p[1]);
- int proceed = 1;
- /*cycle keeps on indefinitely*/
- while (proceed) {
- sleep(15); //increased the time so I have time to send signals
- while (read(p[0], &csig, sizeof(char)) > 0) {
- sig=atoi(&csig);
- signals[sig]++;
- /*if alternating sigals, error*/
- if (signals[1] && signals[2]) {
- printf("Error: alternating SIGUSR1 and SIGUSR2n%dt%dn", signals[1], signals[2]);
- }
- /*if 2 consecutive signals, success*/
- if (signals[sig] == 2) {
- printf("Success: two consecutive SIGUSR1 or SIGUSR2n");
- }
- /*if three consecutive signals, exit*/
- if (signals[sig] == 3) {
- kill(pid, SIGSTOP);
- proceed = 0;
- break;
- }
- /*make 0 any non repeating signal != sig*/
- for(i = 0; i< 3; i++) {
- if (i != sig) {
- signals[i] = 0;
- }
- }
- }
- }
- /*child*/
- } else {
- close(p[0]);
- signal(SIGUSR1, sigHandler);
- signal(SIGUSR2, sigHandler);
- signal(SIGALRM, sigHandler);
- signal(SIGSTOP, sigHandler);
- while (1) {
- sleep(5); //no need to do anything else
- }
- exit(1);
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment