后台进程和文件输出的信号处理

时间:2017-01-30 16:42:15

标签: c unix signals fork

我一直在考虑以下代码

#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之后的SIGTERM。然而,这种情况并非如此。我的错在哪里?

1 个答案:

答案 0 :(得分:1)

您似乎正在捕捉SIGKILL,然后发送您没有处理程序的kill -TERM $pid。如果您使用kill -KILL而不是t=image; % gray scale image red=t; green=t; blue=t; for i=1:size(indx,1) %indx: indexes of the featured coordinates red(indx(i,1),indx(i,2))=255; green(indx(i,1),indx(i,2))=0; blue(indx(i,1),indx(i,2))=0; end out=cat(3,red,green,blue); ,则可能会看到预期的输出。