c++ - 在对象外部访问时,尝试从文件描述符读取到缓冲区失败
问题描述
我从来没有使用过文件描述符,我对这种行为有些困惑。我对并发性也很陌生,而且这些函数的文档也相当缺乏。
我的 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
解决方案
推荐阅读
- python - 相当于 tensorflow 2.0 beta1 中的 tf.assign?
- flutter - 问题在列中展开的列表视图上方呈现小部件
- python - Pip 要为一个包删除的文件列表在哪里
- php - 从php调用动态axsoap服务方法时出错
- python - 在 Python 中将图像保存为 OIB 文件
- javascript - Chrome 扩展在打开新标签后退出运行 javascript
- mysql - 更新 MySQL 表中的行
- json - DRF:序列化来自外部网络请求的数据
- c - 警告:来自链表结构中不兼容指针类型的赋值
- python-3.x - 如何在 VS Code 终端中激活 python 虚拟环境?