Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- double old_val = 0;
- double val = 0;
- double r = 0;
- int pos = 0;
- int child_pid;
- int counter = 0;
- void child_end(int sig)
- {
- printf("Child %d has ended. Exit code: %d\n", child_pid, sig);
- exit(0);
- }
- void print_value(int sig)
- {
- printf("Value: %f\n", val);
- counter++;
- if(counter == 2)
- {
- exit(15);
- }
- }
- void child_proc() {
- struct sigaction sig;
- sig.sa_handler = print_value;
- sig.sa_flags = 0;
- sigaction(SIGUSR1, &sig, NULL);
- printf("Child process started.\n");
- while(1)
- {
- val = old_val + (1/r);
- old_val = val;
- }
- }
- void print_main(int sig)
- {
- printf("ALARM\n");
- kill(child_pid,SIGUSR1);
- if(pos == 3) pos = 0;
- switch(pos)
- {
- case 0: {
- printf("****\n");
- break;
- }
- case 1: {
- printf("++++\n");
- break;
- }
- case 2: {
- printf("----\n");
- break;
- }
- default: break;
- }
- pos++;
- }
- void parent_proc()
- {
- printf("Parent process started.\n");
- while(1)
- {
- //alarm outside of while
- alarm(1);
- }
- }
- int main(int argc, char *args[]) {
- struct sigaction sig;
- sig.sa_handler = child_end;
- sig.sa_flags = 0;
- sigemptyset (&sig.sa_mask);
- if(sigaction(SIGCHLD, &sig, NULL) < 0)
- {
- printf("Error setting handler for SIGCHLD.\n");
- exit(0);
- }
- struct sigaction mainsa;
- mainsa.sa_handler = print_main;
- mainsa.sa_flags = 0;
- sigemptyset (&mainsa.sa_mask);
- if(sigaction(SIGALRM, &mainsa, NULL) < 0)
- {
- printf("Error setting handler for SIGALRM.\n");
- exit(0);
- }
- if(argc != 3)
- {
- fprintf(stderr, "Usage: %s <a0> <r>\n", args[0]);
- exit(1);
- }
- old_val = atof(args[1]);
- r = atof(args[2]);
- if ((child_pid = fork()) < 0)
- {
- printf("Error creating child process\n");
- exit(1);
- }
- if (child_pid == 0)
- {
- child_proc();
- exit(0);
- } else
- {
- //signals here
- parent_proc();
- }
- exit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement