1

我正在尝试在 Linux 中编写一个简单的守护程序,它将创建一个 FIFO,然后收集写入 FIFO 的任何内容,并稍后将该数据写入文件。

我的期望是,一旦我的守护进程创建了 FIFO,我就可以重复执行“echo text > /myfifo”。完成后,我可以执行“echo quit > /myfifo”,我的程序将退出并将所有数据写入磁盘。

我目前正在使用 poll() 来了解 FIFO 上何时有更多数据。这工作正常,直到我第一次将数据回显到 FIFO 之后。数据回显良好,但此后我的民意调查不断返回 SIGHUP。

在每个进程写入 FIFO 后,我是否需要重置(或关闭并重新打开)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);
4

1 回答 1

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 年就已经存在了。

因此,的,您需要在读取文件末尾后(在每个进程echo完成写入 FIFO 之后)继续关闭并重新打开 FIFO。

(您还应该注意到,实际上不需要轮询 FIFO,除非在没有数据时该进程还有其他事情要做。read()调用将等到有数据后再返回。)

于 2010-07-11T03:29:08.527 回答