Fixes in lab1

This commit is contained in:
Andrew Golovashevich 2024-10-11 01:49:48 +03:00
parent f8286f50b0
commit 25b4284d09

View File

@ -1,15 +1,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
#include <strings.h>
void wait_clocks(clock_t clocks_to_wait) {
const clock_t end = clock() + clocks_to_wait;
while (clock() < end);
}
struct ping_pong_data_t { struct ping_pong_data_t {
char const *name; char const *name;
@ -23,12 +15,11 @@ void do_ping_pong(int signo) {
if (signo != SIGUSR1) if (signo != SIGUSR1)
return; return;
const clock_t delay_clocks = (clock_t) (CLOCKS_PER_SEC * ping_pong_data.delay_seconds);
printf("[%s] Got signal\n", ping_pong_data.name); printf("[%s] Got signal\n", ping_pong_data.name);
printf("[%s] PID=%d\n", ping_pong_data.name, ping_pong_data.pid_to_print); printf("[%s] Another side PID=%d\n", ping_pong_data.name, ping_pong_data.pid_to_print);
printf("[%s] Sleeping %lf seconds before sending signal\n", ping_pong_data.name, ping_pong_data.delay_seconds); printf("[%s] Sleeping %lf seconds before sending signal\n", ping_pong_data.name, ping_pong_data.delay_seconds);
wait_clocks(delay_clocks); usleep((useconds_t) (1000 * 1000 * ping_pong_data.delay_seconds));
printf("[%s] Sending signal\n", ping_pong_data.name); printf("[%s] Sending signal\n", ping_pong_data.name);
kill(ping_pong_data.pid_to_send, SIGUSR1); kill(ping_pong_data.pid_to_send, SIGUSR1);
} }
@ -55,29 +46,35 @@ int main(void) {
case 0: case 0:
child_pid = getpid(); child_pid = getpid();
ping_pong_data.name = "c"; ping_pong_data.name = "\033[36mchild\033[0m";
ping_pong_data.delay_seconds = 2.5; ping_pong_data.delay_seconds = 1.5;
ping_pong_data.pid_to_print = parent_pid; ping_pong_data.pid_to_print = parent_pid;
ping_pong_data.pid_to_send = parent_pid; ping_pong_data.pid_to_send = parent_pid;
printf("[%s] My PID=%d\n", ping_pong_data.name, getpid());
signal(SIGUSR1, do_ping_pong); signal(SIGUSR1, do_ping_pong);
break; break;
default: default:
ping_pong_data.name = "c"; ping_pong_data.name = "\033[31mparent\033[0m";
ping_pong_data.delay_seconds = 2.5; ping_pong_data.delay_seconds = 1.5;
ping_pong_data.pid_to_print = child_pid; ping_pong_data.pid_to_print = child_pid;
ping_pong_data.pid_to_send = child_pid; ping_pong_data.pid_to_send = child_pid;
printf("[%s] My PID=%d\n", ping_pong_data.name, getpid());
signal(SIGUSR1, do_ping_pong); signal(SIGUSR1, do_ping_pong);
kill(parent_pid, SIGUSR1); kill(parent_pid, SIGUSR1);
break; break;
} }
while (is_running) while (is_running)
pause(); pause();
printf("[%s] Interrupted\n", ping_pong_data.name);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }