gpt4 book ai didi

c++ - 在 Linux 中使用 NONBLOCK 模式的命名管道 + SELECT

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:38 24 4
gpt4 key购买 nike

我正在尝试使用 O_NONBLOCK 模式创建命名管道,并在单独的线程中使用“SELECT”方法监听读取事件。当我在主线程中休眠一段时间后试图关闭程序时出现问题。我希望当使用 close 方法关闭命名管道的文件描述符时,选择操作应立即停止并返回一些值。但不幸的是,当文件描述符关闭时,select操作没有任何反应,执行select方法的线程就挂了...

有什么解决办法吗?示例代码如下。

#include <pthread.h>
#include <limits.h>
#include <cctype>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/shm.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <exception>
#define BUFFER PIPE_BUF
#define LPVOID void *
#define BOOL int
#define TRUE 1
#define CONST const
#define CHAR char

class CPipeTest
{
public:

int fd;
int nfd;
fd_set rfd;
pthread_t t;

CPipeTest() {};
~CPipeTest() {};

static LPVOID fnExecuteThread(LPVOID lpParam)
{
((CPipeTest*)lpParam)->fnRunThread();
return NULL;
}

BOOL fnRunThread()
{
printf("Going to listen...\r\n");
select(nfd, &rfd, NULL, NULL, NULL);
printf("Close listener...\r\n");
return TRUE;
}

void fnInit()
{
CONST CHAR * name = "./test_fifo1";
mkfifo(name, 0777);
fd = open(name, O_NONBLOCK | O_RDONLY);
nfd = fd + 1;
FD_ZERO(&rfd);
FD_SET(fd, &rfd);

pthread_create( &t, NULL, fnExecuteThread, (LPVOID)this);

sleep(30);
printf("Close file descriptor - listener should be closed automatically and immediately\r\n");
close(fd);
printf("Descriptor closed wait for thread to to be closed\r\n");
pthread_join(t, NULL);
printf("Thread is closed - everything is fine\r\n");
}

};

int main()
{
CPipeTest pi;
pi.fnInit();

return 0;

}

最佳答案

应该有两个文件描述符,一个用于读,另一个用于写。

对于阻塞模式,用于写入的(您将在初始线程中关闭)应该在初始线程中打开,在启动“读取”线程之后。用于阅读的应该在阅读器线程中打开。对于非阻塞模式,它可能在同一个线程中完成,如果你首先打开读取,然后写入(或者 ENXIO 将返回用于打开 writer 而没有读者)。

当您关闭写入端时,读取端将收到带有select 的通知。 (如果有真正的数据交换,下面的 read 将读取零字节,这就是检测 EOF 的方式)。

如果您切换到匿名管道,您将自动从 pipe 调用中获得一对描述符。

关于c++ - 在 Linux 中使用 NONBLOCK 模式的命名管道 + SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14327299/

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