0

只是这个简短的问题:如果我们收到 SIGTERM 并退出,我们如何关闭 FIFO 文件。如果我的文件是普通文件,它可以工作。但是如果是FIFO,就不行了。有任何想法吗?谢谢 :)

/**
    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;
    }
4

1 回答 1

1

您必须在打开 FIFO 之前设置信号处理程序。我的 Unix FIFO 有点生锈了 :) 但我怀疑它open也阻止了对等方打开它。因此,当您终止进程时,它实际上并不是在循环内部等待,而是在等内部等待,open因此信号处理程序不会关闭。

另一方面,fclose在信号处理程序中是一个坏主意。如果 I/O 库操作被信号中断怎么办?该库不能从信号处理程序中重入。信号处理程序只能使用某些“异步安全”功能。另一个是exit,它在库中执行复杂的操作,其中许多对于异步信号处理程序来说是不安全的。_exit应该使用该函数。

如果您导致进程退出信号处理程序,那么担心内存是否泄漏是没有意义的,并且不可能“正确”。一方面,malloc它本身可能会被信号处理程序中断;free打电话来解放任何东西都是不安全的。

于 2013-06-10T01:52:02.350 回答