无法使Unix FIFO正常工作?

时间:2010-07-11 03:20:16

标签: c fifo

我正在尝试在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);

1 个答案:

答案 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()调用将等到有数据之前返回。)