我有一个我已经编写过的子进程,它输出包含一些状态信息的固定大小的结构。我的计划是有一个单独的线程,从该进程的stdout读取,以便在数据到来时提取数据。
我必须定期检查一个标志以确保程序仍在运行,所以我可以干净地关闭,所以我必须将管道设置为非阻塞,只需要运行一个循环拼接状态消息。
有没有一种规范的方式我可以告诉Linux“要么在超时之前读取全部金额,要么就读”,这样我就可以检查我的标志,但是我不必处理阅读结构件餐?
或者,有没有办法将数据推回管道?我可以尝试阅读整个事情,如果它在它准备就绪之前超时,推回我所拥有的并重新尝试一下。
我也写了我的popen(所以我可以抓住stdin和stdout,所以我完全可以使用套接字而不是管道,如果有帮助的话)。
答案 0 :(得分:0)
这就是我最后为那些好奇的人做的事情。我刚刚编写了一个包装文件描述符和消息大小的类,并给了我" all-or-none"我想要的行为。
Configuration_Fields_Table Fields_to_show
Id Name Value Id Name
1 Combobox1 use 1 TextBox
2 Combobox1 don't use 2 Label
3 Combobox2 I agree 3 Grid
4 Combobox2 I don't agree
5 Combobox3 I have
6 Combobox3 I don't have
MappingTable
Id Field_to_show_id Conf_Field_id
1 1 1
2 1 3
3 1 6
4 2 2
5 2 6
然后可以使用以下内容:
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_;
};