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