如何知道命名管道中有多少字节?
我想在插入新对象之前检查是否还有足够的空间。目前,如果接收进程将对象从管道中取出的速度变慢或崩溃,我的发送进程就会卡住。
我的代码如下:
/*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;
}
最佳答案
通常,当您使用write
或read
系统调用时,阻塞会发生在命名管道上。因此,如果管道打开用于读取,进程将阻塞直到其他进程打开它用于写入,反之亦然。如果不希望出现这种行为,可以在 open()
调用中使用 O_NONBLOCK
标志来禁用默认的阻塞操作。
如果您想知道管道何时准备好读/写,您应该查看 man 2 select
和 man 2 poll
命令,它们会通知此类事件。
如果您使用阻塞调用,您还可以在 ioctl
调用中使用 FIONREAD
:
rc = ioctl(pipefd, FIONREAD, &nBytesAvailable);
请注意,ioctl()
调用行为是实现定义的,您应该查看系统的手册页 (man 2 ioctl
) 以获得更准确的想法。
关于c - 命名管道的大小?进程卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25281800/