#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void handle_child_signal(int sig) {
printf("Child (PID=%d): Alarm went off\n", getpid());
kill(getppid(), SIGUSR1);
exit(EXIT_SUCCESS);
}
void handle_parent_signal(int sig) {
printf("Parent (PID=%d): Received SIGUSR1 from child after child's alarm\n", getpid());
}
int main() {
pid_t pid;
int status;
pid = fork(); // 1.fork하기
if (pid < 0) { // 예외처리
perror("Failed to fork child process.\n");
exit(EXIT_FAILURE);
}
else if (pid == 0) { // child process
printf("Child (PID=%d): Setting alarm for 3 seconds and waiting via pause()\n", getpid());
signal(SIGALRM, handle_child_signal);
alarm(3); // 2. pid==0 일때 set alarm, waiting signal SIGALARM
pause();
}
else { // pid > 0 즉 parent process.
printf("Parent (PID=%d): Preparing waiting for SIGUSR1 via pause()\n", getpid());
signal(SIGUSR1, handle_parent_signal);
pause(); // 기다리기.
printf("Parent (PID=%d): Received SIGUSR1 from child after child's alarm\n", getpid());
printf("Parent (PID=%d): Setting alarm for 5 seconds and waiting via pause()\n", getpid());
alarm(5);
pause();
printf("Parent (PID=%d): Sending SIGUSR2 to my child %d\n", getpid(), pid);
kill(pid, SIGUSR2);
waitpid(pid, &status, 0);
printf("Child (PID=%d): Exited with status %d\n", pid, status);
}
return 0;
}