C/Linux

[C] ctrl + c 로 종료되지 않는 프로그램 구현하기

김호록님 2023. 1. 3. 19:43

Hello_Again()

  • set이라는 이름의 시그널 세트를 생성하시오.
  • set을 이용하여 프로그램이 ctrl + c로 종료되지 않도록 만드시오.
  • (힌트: sigprocmask를 사용할 것)
#define _GNU_SOURCE
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void) {

  int cnt;
  sigset_t chkset;
	sigset_t set;
  sigemptyset(&set);
  sigaddset(&set, SIGINT);
  sigprocmask(SIG_SETMASK, &set, NULL);

  // do not modify
  cnt = 0;
  for (;;) {
    printf("hello\n");
    fflush(stdout);
    sleep(1);
    cnt++;

    if (!(cnt % 3)) {
      raise(SIGINT);

      sigprocmask(0, NULL, &chkset);
      // check for other signals are blocked
      // NSIG is defined in signal.h
      // don't worry about the red underline
      for (int i = 1; i < NSIG; i++) {
        if (i == SIGINT)
          continue;
        if (sigismember(&set, i)) {
          printf("Block just SIGINT not SIG%s(%d)\n", strsignal(i), i);
          exit(EXIT_FAILURE);
        }
      }

      // take pended masks
      if (sigpending(&chkset)) {
        perror("pending\n");
        exit(EXIT_FAILURE);
      }

      // check SIGINT is successfully blocked
      if (sigismember(&chkset, SIGINT)) {
        printf("Success\n");
        exit(EXIT_SUCCESS);

      }
      // fail to blocking SIGINT
      else {
        printf("Failed\n");
        exit(EXIT_FAILURE);
      }
    }
  }
  return 0;
}