从linux中的管道/套接字读取所有的结构或什么都没有?

时间:2016-02-18 15:05:45

标签: c++ linux sockets pipe posix

我有一个我已经编写过的子进程,它输出包含一些状态信息的固定大小的结构。我的计划是有一个单独的线程,从该进程的stdout读取,以便在数据到来时提取数据。

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

有没有一种规范的方式我可以告诉Linux“要么在超时之前读取全部金额,要么就读”,这样我就可以检查我的标志,但是我不必处理阅读结构件餐?

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

我也写了我的popen(所以我可以抓住stdin和stdout,所以我完全可以使用套接字而不是管道,如果有帮助的话)。

1 个答案:

答案 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_;
    };