C 接收到信号SIGTERM后关闭FIFO
只是这个简短的问题:如果我们收到SIGTERM并退出,我们如何关闭FIFO文件。 如果我的文件是普通文件,它就可以工作。但如果是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库操作被信号中断怎么办?该库不能从信号处理程序重入
在打开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;
}