Как остановить процесс от закрытия после отправки определенного сигнала? - PullRequest
0 голосов
/ 22 ноября 2018

Мне нужно создать программу, которая будет создавать дочерние процессы, которые будут обрабатывать процессы.В случае вызова SIGXCPU дочерний процесс должен закрыться, но при получении другого сигнала процесс не должен закрываться, а отображать информацию.Как я могу изменить функцию signal_handler, чтобы остановить закрытие моего процесса?

Я вызываю сигналы из второго окна терминала.

void signals_handler(int signal) {
   psignal(signal,"\nRecived signal");
   printf("Signal number is: %d\n", signal);
   return;
}

void sig_XCPU(int signal() {
   signal(XCPU, sig_XCPU);
}

...

int main(void)
{

   if(fork() == 0) {
   print("PID: %d", getpid();
   signal(SIGXCPU, sig_xcpu)
   for(int = 1; i < 65; i++) {
       if(i != 24) //SIGXCPU number
       signal(i, signals_handler);
   }
   sleep(100);
   return 0;
   }
}

return 0;
}

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете проверить так:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void signal_handle(int sig) {
  switch (sig) {
  case SIGXCPU: {
    char st[] = "child recesive SIGXCPU, quit\n";
    write(STDOUT_FILENO, st, sizeof(st));
    exit(EXIT_SUCCESS);
    break;
  }
  case SIGINT: {
    char st[] = "child recesive SIGINT\n";
    write(STDOUT_FILENO, st, sizeof(st));
    break;
  }
  default: break;
  }
 return;
}

void set_signal() {
  signal(SIGXCPU, signal_handle);
  signal(SIGINT,  signal_handle);
}

int main() {
  pid_t pid = fork(); 
  if (pid == 0) { // child
    set_signal();
    char st[] = "child set signal\n";
    write(STDOUT_FILENO, st, sizeof(st));
    for (;;)
      ;
  }
  // parent
  sleep(3); // wait child set_signal
  // test SIGINT
  {
    char st[] = "parent send SIGINT\n";
    write(STDOUT_FILENO, st, sizeof(st));
    kill(pid, SIGINT);
  }
  sleep(3);

  // test SIGXCPU 
  {
    char st[] = "parent send SIGXCPU\n";
    write(STDOUT_FILENO, st, sizeof(st));
    kill(pid, SIGXCPU);
  }
  wait(NULL);

  return 0;
}
...