我正在尝试在Linux中编写一个简单的守护进程,它将创建一个FIFO,然后收集写入FIFO的任何内容,并在以后将该数据写入文件。
我的期望是,一旦我的守护进程创建了FIFO,我就可以反复进行“echo text> / myfifo”。当我完成后,我可以执行“echo quit> / myfifo”,我的程序将退出并将所有数据写入磁盘。
我目前正在使用poll()来了解FIFO上何时有更多数据。这工作正常,直到我第一次将数据回送到FIFO。数据回复得很好,但我的民意调查后不断返回SIGHUP。
每个进程写入后,是否需要重置(或关闭并重新打开)FIFO?
我的代码的伪代码如下所示:
ret = fifo(my_fifo, mode);
fd = open(my_fifo, O_RDONLY | O_NONBLOCK);
polling.fd = fd;
polling.events = POLLIN | POLLPRI;
do {
ret = poll(&polling, 1, -1);
amt = read(fd, buf, bufsize);
// do stuff
} while (!done);
答案 0 :(得分:2)
我认为你必须继续重新开放FIFO。我有一个监控FIFO的程序,监控循环是:
/* Implement monitor mode */
void sql_monitor(char *fifo)
{
if (chk_fifo(fifo) != 0)
cmd_error(E_NOTFIFO, fifo);
/* Monitor -- device is assumed to be a FIFO */
while (1)
{
ctxt_newcontext();
if (ctxt_setinput(fifo) != 0)
sql_exit(1);
sql_file();
ctxt_endcontext();
}
}
ctxt_newcontext()
函数存储当前的I / O状态; ctxt_setinput()
函数将输入文件设置为指定文件 - 在这种情况下为FIFO。 sql_file()
函数从文件(FIFO)读取,直到到达结尾 - 文件关闭。 ctxt_endcontext()
撤消了ctxt_newcontext()
所做的事情。这个过程重复了......这段代码自1990年左右开始出现。
因此,是,您需要在读取文件末尾后继续关闭并重新打开FIFO(在echo
等每个进程完成写入FIFO之后)。< / p>
(您还应该注意到,除非在没有数据的情况下进程还有其他事情要做,否则根本不需要轮询FIFO。read()
调用将等到有数据之前返回。)