Quick actions

cmd+k|ctrl+k

Navigation

Languages

lab12

Snippet info

Language

C

Visibility

public

Author

dk90897

Created

2023-04-21T03:20:07.938317Z

Updated

2023-04-21T03:20:07.938317Z

#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;
}
INFO