首页 > 解决方案 > 在对象外部访问时,尝试从文件描述符读取到缓冲区失败

问题描述

我从来没有使用过文件描述符,我对这种行为有些困惑。我对并发性也很陌生,而且这些函数的文档也相当缺乏。

我的 MessageReciever 构造函数打开一个 pty。据我了解,在调用 Receive 消息时,代码会分叉。主人应该点击下一个条件并从函数中返回。我知道这是因为 main 中的代码没有阻塞。子进程读取文件描述符,将其转换为字符串并将其保存在向量中。目前我正在直接打印缓冲区,但我也可以打印向量中的最后一个元素,它的作用基本相同。但是,当我尝试在课堂外访问它时,主要是什么都没有。我认为这可能是某种类型的并发问题,但我不确定如何解决。

代码

#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <stdio.h>
#include <util.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string>
#include <vector>

class MessageReceiver
{
  public:
  MessageReceiver()
  {
    openpty(&master, &slave, NULL, NULL, NULL);
  }

  ~MessageReceiver()
  {
    close(master);
    close(slave);
  }

  void receiveMessage()
  {
    pid_t pid = fork();
    printf("PID = %d\n",pid);
    if(pid > 0)
    {
      fd_set rfds;
      struct timeval tv;
      tv.tv_sec = 0;
      tv.tv_usec = 0;
      char buf[4097];
      ssize_t size;
      size_t count = 0;

      while (1)
      {
        if (waitpid(pid, NULL, WNOHANG) == pid) 
        {
          break;
        }
        FD_ZERO(&rfds);
        FD_SET(master, &rfds);
        if (select(master + 1, &rfds, NULL, NULL, &tv)) 
        {
          size = read(master, buf, 4096);
          printf("Buffer = %s", buf);
          messageBuffer.push_back(std::string(buf));
          buf[size] = '\0';
          count += size;
        }
      }

    }

  }

  std::string getLastMessage()
  {
    std::string s;
    if(messageBuffer.size() > 0)
    {
      s = messageBuffer.back();
    }
    else
    {
      s = "NULL";
    }
    return s;
  }

  private:
  int master, slave;
  std::vector<std::string> messageBuffer;
};

int main()
{
  MessageReceiver m;
  m.receiveMessage();
  std::string lastMessage = m.getLastMessage();
  printf("Printing message buffer:\n");
  for(;;)
  {
    if(m.getLastMessage() != lastMessage)
    {
      printf("Message: %s\n", m.getLastMessage().c_str());
    }
  }
  return 0;
}

初始输出

PID = 8170
PID = 0
Printing message buffer:

当 hello 回显到 pty 时的附加输出

Buffer = hello

标签: c++concurrencyposixpty

解决方案


推荐阅读