Вопрос

just this short question: how do we close the FIFO file if we receive the SIGTERM and exit. If my file is a normal file, it works. But if it is a FIFO, it doesn't work. Any ideas? Thanks :)

/**
    with the help of these guys, 
    it is not a good approach to write it, 
    though it works. close(fd) is pointless here.
**/

    FILE * myfile;
    int fd;
    void sig_handler(int signum) {
        if (signum == SIGTERM) {
            *close(fd);*
            fclose(myfile);
            printf("caught SIGTERM\n");
            exit(EXIT_SUCCESS);
        }
    }
    int main(void) {
        myfile = fopen("file", "w+");
        fd = open("myfifo", O_RDONLY);
        {
            struct sigaction act;
            memset(&act, 0, sizeof(act));
            act.sa_handler = sig_handler;
            sigaction(SIGTERM, &act, 0);
        }
        for(;;)
            pause();
        return 0;
    }
Это было полезно?

Решение

You have to set the signal handler before opening the FIFO. My Unix FIFO's are a little rusty :) but I suspect that the open is blocking for the peer to open it also. So when you kill the process, it is not actually waiting inside your loop, but inside the open and so the signal handler does not go off.

On a different note, fclose in a signal handler is a bad idea. What if an I/O library operation is interrupted by the signal? The library is not reentrant from signal handlers. Only certain "async safe" functions can be used from signal handlers. Antoher one is exit, which does complicated things inside the library, many of which are not safe from an asynchronous signal handler. The _exit function should be used instead.

Worrying whether memory leaked, if you're causing the process to exit from a signal handler, is pointless, and impossible to get "right". For one thing, malloc itself might be interrupted by the signal handler; it is not safe to call free to liberate anything.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top