Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 接收到信号SIGTERM后关闭FIFO_C_Signals_Posix_Named Pipes_Sigterm - Fatal编程技术网

C 接收到信号SIGTERM后关闭FIFO

C 接收到信号SIGTERM后关闭FIFO,c,signals,posix,named-pipes,sigterm,C,Signals,Posix,Named Pipes,Sigterm,只是这个简短的问题:如果我们收到SIGTERM并退出,我们如何关闭FIFO文件。 如果我的文件是普通文件,它就可以工作。但如果是FIFO,它就不起作用。 有什么想法吗?谢谢:) 在打开FIFO之前,必须设置信号处理器。我的Unix FIFO有点生锈:)但我怀疑打开的正在阻止对等方也打开它。因此,当您终止进程时,它实际上并不是在您的循环中等待,而是在打开中等待,因此信号处理程序不会关闭 另一方面,在信号处理程序中,fclose是个坏主意。如果I/O库操作被信号中断怎么办?该库不能从信号处理程序重入

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


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

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


如果导致进程从信号处理程序退出,那么担心内存是否泄漏是毫无意义的,也不可能做到“正确”。一方面,
malloc
本身可能会被信号处理程序中断;调用
free
释放任何东西都是不安全的。

它不可能不工作。当进程退出时,其所有FD都将自动关闭。是什么让你认为它不工作?有4个信号被发送到它。然后我使用valgrind进行检查,有4个块没有释放。我不太确定,因为我要么添加close(fd),要么不添加,4块泄漏就存在。这些未释放的块肯定丢失了,还是仍然可以访问?@Kaz它肯定丢失了。打开时是否有有效的文件描述符?刚刚测试过:
open(path,ordonly)
在未打开写入块的FIFO上。我移动了fd=open(…)在本地块和for循环之间,没有任何区别:(@thejh是的,这个程序只是从那个管道接收到的。非常感谢,Kaz!你的回答中有很多信息。所以,现在我的理解是:如果我不在这里丢失文件,我应该在哪里做呢?实际上,我程序中的那个文件是一个日志文件,所以它会记录最后一个信息“程序已关闭”当SIGTERM被抓到,然后关闭文件。如果我不在这里做的话,还会有一个漏洞。
/**
    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;
    }