2010-07-11 35 views
1

我正在尝试在Linux中编写一个简单的守护进程,它将创建一个FIFO,然后收集写入FIFO的任何内容,并在稍后将该数据写入文件。无法正常使用Unix 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); 

回答

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年

所以这段代码已经出现,YES,你将需要保持关闭和读取文件的末尾(每道工序后,如echo完成后重新开放FIFO写入FIFO)。 (您还应该注意到,除非在没有数据的情况下进程需要做其他事情,否则实际上不需要轮询FIFO,read()调用将等到有数据返回时为止。)

+0

是的,FIFO必须重新打开。很多人忘记了在同步模式下,打开FIFO会阻塞,直到通信的另一端也打开它。这是为了使其可用于例如外壳重定向。所以在某种程度上,它表现得像一个连接。 – Dummy00001 2010-07-11 19:39:29