gpt4 book ai didi

c++ - 从 Linux 中的管道/套接字中读取所有结构或不读取任何结构?

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:54 27 4
gpt4 key购买 nike

我有一个已打开的子进程,它输出包含一些状态信息的固定大小的结构。我的计划是有一个单独的线程从该进程的标准输出中读取数据,以便在数据到来时将其拉入。

我必须定期检查一个标志以确保程序仍在运行,以便我可以干净地关闭,所以我必须将管道设置为非阻塞并且只需要运行一个将状态消息拼凑在一起的循环.

有没有一种规范的方法可以告诉 Linux“要么读取全部内容,要么在超时前不读取任何内容”,这样我就可以检查我的标志,但我不必处理读取结构 block 餐?

或者,有没有办法将数据推回管道?我可以尝试阅读整个内容,如果它在一切准备就绪之前超时,请将我所拥有的内容推回并稍后重试。

我还写了我的 popen(所以我可以获取标准输入和标准输出,所以我完全可以使用套接字而不是管道,如果有帮助的话)。

最佳答案

以下是我最终为所有好奇的人所做的事情。我刚刚编写了一个包含文件描述符和消息大小的类,并为我提供了我想要的“全有或全无”行为。

struct aonreader { 
aonreader(int fd, ssize_t size) {
fd_ = fd;
size_ = size_;
nread_ = 0;
nremain_ = size_;
}

ssize_t read(void *dst) {
ssize_t ngot = read(fd, (char*)dst + nread_, nremain_);
if (ngot < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
return -1; // error
}
} else {
nread_ += ngot;
nremain_ -= ngot;

// if we read a whole struct
if (nremain_ == 0) {
nread_ = 0;
nremain_ = size_;
return size_;
}
}
return 0;

private:
int fd_;
ssize_t size_;
ssize_t nread_;
ssize_t nremain_;
};

然后可以这样使用:

    thing_you_want thing;
aonreader buffer(fd, sizeof(thing_you_want));
while (running) {
size_t ngot = buffer.read(&thing);
if (ngot == sizeof(thing_you_want)) {
<handle thing>
} else if (ngot < 0) {
<error, handle errno>
}
<otherwise loop and check running flag>
}

关于c++ - 从 Linux 中的管道/套接字中读取所有结构或不读取任何结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35485069/

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