2017-01-30 19 views
0

сигнала я рассматривал следующий кодобработки на фоне процесса и файла вывода

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

FILE* file; 

void signal_handler(int _signal) { 
    switch(_signal){ 
     case SIGTERM: 
      fprintf(file, "Ouch, the Daemon Child was killed!\n"); 
      fflush(file); 
      abort(); 
     default: 
      fprintf(file, "So what?!\n"); 
      fflush(file); 
    } 
} 

int main() { 
    pid_t pid; 
    int status; 
    pid = fork(); 
    if(pid != 0) { 
     // parent 
     waitpid(pid, &status, WNOHANG); // daemonize the child 
    } else { 
     // child 
     signal(SIGTERM, signal_handler); 
     file = fopen("daemon.txt", "w"); 
     while(1) { 
      sleep(1); 
      fprintf(file, "Daemon child is alive.\n"); 
      fflush(file); 
     } 
    } 
    return 0; 
} 

и я ожидал, я мог бы найти в конце daemon.txt строковое Ouch, the Daemon Child was killed!, после sudo kill -KILL. Однако, это не так. Где моя вина?

+0

Если я правильно понял ваш код: «Ой, Демон был убит! \ N» должен быть напечатан, когда процесс получает SIGTERM. Однако вы посылаете SIGKILL к нему. Что вы ожидали? – schaiba

+0

Где я могу найти полный список сигналов kill? Я ссылался на https://www.tutorialspoint.com/c_standard_library/c_function_signal.htm, но нет SIGKILL там – Fabio

+1

Сигналы зависят от ОС. В качестве отправной точки см. Это: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html, но лучше всего, если вы ссылаетесь на файл 'signal.h' вашей операционной системы. – schaiba

ответ

1

Похоже, вы поймаете SIGTERM, а затем отправите SIGKILL, для которого у вас нет обработчика. Вероятно, вы увидите ожидаемый результат, если используете kill -TERM $pid, а не kill -KILL.