gpt4 book ai didi

c - 命名管道的大小?进程卡住

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:25 25 4
gpt4 key购买 nike

如何知道命名管道中有多少字节?

我想在插入新对象之前检查是否还有足够的空间。目前,如果接收进程将对象从管道中取出的速度变慢或崩溃,我的发送进程就会卡住。

我的代码如下:

/*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;
}

最佳答案

通常,当您使用writeread 系统调用时,阻塞会发生在命名管道上。因此,如果管道打开用于读取,进程将阻塞直到其他进程打开它用于写入,反之亦然。如果不希望出现这种行为,可以在 open() 调用中使用 O_NONBLOCK 标志来禁用默认的阻塞操作。

如果您想知道管道何时准备好读/写,您应该查看 man 2 selectman 2 poll 命令,它们会通知此类事件。

如果您使用阻塞调用,您还可以在 ioctl 调用中使用 FIONREAD:

 rc = ioctl(pipefd, FIONREAD, &nBytesAvailable);

请注意,ioctl() 调用行为是实现定义的,您应该查看系统的手册页 (man 2 ioctl) 以获得更准确的想法。

关于c - 命名管道的大小?进程卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25281800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com