#include #include #include #include #include #include void wait_clocks(clock_t clocks_to_wait) { const clock_t end = clock() + clocks_to_wait; while (clock() < end); } struct ping_pong_data { char const *name; const pid_t pid_to_print; const pid_t pid_to_send; double delay_seconds; }; int run_exchange(char const *name, pid_t pid_to_print, pid_t pid_to_send, int wait_first, double delay_seconds) { const clock_t delay_clocks = (clock_t) (CLOCKS_PER_SEC * delay_seconds); if (wait_first) goto WAIT; while (1) { printf("[%s] Got signal\n", name); printf("[%s] PID=%d\n", name, pid_to_print); printf("[%s] Sleeping %lf seconds before sending signal\n", name, delay_seconds); wait_clocks(delay_clocks); printf("[%s] Sending signal\n", name); kill(pid_to_send, SIGUSR1); WAIT: pause(); } perror("Program interrupted"); return EXIT_SUCCESS; } void noop(int){ } int main(void) { signal(SIGUSR1, noop); pid_t parent_pid = getpid(); pid_t child_pid = fork(); switch (child_pid) { case -1: perror("Failed to fork\n"); return EXIT_FAILURE; case 0: child_pid = getpid(); return run_exchange("c", parent_pid, parent_pid, 1, 2.5); default: return run_exchange("p", child_pid, child_pid, 0, 2.5); } }