在对象外部访问时,尝试从文件描述符读取到缓冲区失败

时间:2019-06-19 23:40:08

标签: c++ concurrency posix pty

我从未使用过文件描述符,对此行为有些困惑。我对并发还相当陌生,而且这些功能的文档也很缺乏。

我的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:

当您好向pty回声时的其他输出

Buffer = hello

0 个答案:

没有答案