如何确定命名管道中有多少字节?
我想在插入新对象之前检查是否还有足够的空间。目前,如果接收过程要将对象从管道中取出或者是否崩溃,我的发送过程会卡住。
我的代码如下:
/*We open the fifo for read and write*/
if((fd_fifo=open(fifo_name, O_RDWR)) == - 1)
{
snprintf (retval, strlen(retval), "Can't open the fifo: %s", fifo_name);
*length = strlen(retval);
return retval;
}
// write(fd_fifo,puffer,strlen(puffer)) ;
int wbytes = write(fd_fifo,messagebody,strlen(messagebody)) ;
if (wbytes == -1)
{
snprintf (retval, strlen(retval), "Can't write to fifo: %s", fifo_name);
*length = strlen(retval);
return retval;
}
答案 0 :(得分:3)
通常,当您使用write
或read
系统调用时,会在命名管道上发生阻塞。因此,如果打开管道进行读取,则该过程将阻塞,直到某个其他进程打开它进行写入,反之亦然。如果不希望出现这种情况,可以在O_NONBLOCK
调用中使用open()
标志来禁用默认阻止操作。
如果您想知道管道何时可以读/写,您应该查看man 2 select
和man 2 poll
命令,这些命令会通知此类事件。
如果您使用屏蔽通话,还可以在FIONREAD
电话中使用ioctl
:
rc = ioctl(pipefd, FIONREAD, &nBytesAvailable);
请注意,ioctl()
调用行为是实现定义的,您应该检查系统的手册页(man 2 ioctl
)以获得更准确的想法。