gpt4 book ai didi

c - 当写入者来去时从命名管道重新读取

转载 作者:行者123 更新时间:2023-12-05 01:33:08 28 4
gpt4 key购买 nike

我遇到了一个问题,我必须从命名管道中读取数据。我必须处理命名管道的编写器来来去去的情况,但我需要在整个应用程序中保持同一个管道打开。

我在下面的代码中总结了这一点。

int main( int c, char *v[] )
{
int rfd;
if ( (rfd = open( PIPENAME, O_RDONLY | O_NONBLOCK )) < 0 )
{
perror( "open" );
return 1;
}

char buffer[ 1024000 ];

// used to give select an upper bound on number of fds
int nfd = rfd + 1;

fd_set rfds;
FD_ZERO( &rfds );
FD_SET( rfd, &rfds );

while( true )
{
int nr = select( nfd, &rfds, NULL, NULL, NULL );

if ( nr < 0 )
{
perror( "select" );
break;
}

if ( FD_ISSET( rfd, &rfds ) )
{
//std::cout << "RFD SET" << std::endl;
// Ok, we have data we can read
int nread = read( rfd, buffer, sizeof( buffer ) );
if ( nread < 0 )
{
perror( "read" );
break;
}
else if ( nread == 0 )
{
std::cout << "read 0" << std::endl;
}
else
{
std::cout << "read " << nread << " bytes" << std::endl;

}

}
}

close( rfd );

return 0;
}

我遇到的问题是,在第一个进程写入命名管道并断开连接(关闭)结束后,我的程序不会阻塞在选择上。它有效地设置了 rfd,并且读取返回在紧密循环中读取的零字节。

我需要 rfd 处于 NON_BLOCKING 模式,否则 open 将阻塞,直到 writer 出现。

我试过使用 fcntl 设置为 BLOCKING 模式,但这也不起作用。

我对管道语义的有限理解使我认为我需要清除管道上的 EOF 状态,这样 select 现在就会阻塞。但是,我不知道该怎么做。

我全神贯注于你们的集体智慧 :)马克。

最佳答案

好吧,我想出了一个解决方案,但我对它不是很满意。如果您问我,这有点像“敲坚果”。

.....
else if ( nread == 0 )
{
std::cout << "read 0" << std::endl;

FD_ZERO( &rfds );
close( rfd );
if ( (rfd = open( PIPENAME, O_RDONLY | O_NONBLOCK )) < 0 )
{
perror( "re-open" );
break;
}
FD_SET( rfd, &rfds );
nfd = std::max( wfd, rfd ) + 1;
}
else
.....

基本上,我关闭并重新打开管道。

我仍然欢迎更好的解决方案。

关于c - 当写入者来去时从命名管道重新读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2092255/

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