C ++ - 在进程之间发送消息

时间:2016-05-30 17:47:06

标签: c++ struct printing

我有一些通过管道连接的进程,因此一个stdout是另一个的stdin,反之亦然。我需要通过stdin和stdout传递这个struct Message,但我无法做到。

结构:

strcut Task{
  bool some;
  char text[MAX_TEXT_AREA];
}

struct Stat{
  char text[MAX_TEXT_AREA];
  unsigned short id;
}

struct Message{
  int nTasks;
  int nStats;
  Task tasks[];
  Stat stats[];
} 

这是我尝试将Message放到stdout:

Message* m; //suppose it's initialized
write(STDOUT_FILENO, m, sizeof(Message));
for(int i=0; i<m->nTasks; ++i) write(STDOUT_FILENO, m->tasks[i], sizeof(Task));
for(int i=0; i<m->nStats; ++i) write(STDOUT_FILENO, m->stats[i], sizeof(Stat));

我遇到了一些编译错误,但我不知道如何解决这个问题。有没有办法打印邮件而不修改任何struct

为了阅读这是我所拥有的:

Message* m;
while(read(STDIN_FILENO, m, sizeof(Message))){
  m->tasks = new Tarea[m->nTasks];
  m->stats = new Stat[m->nStats];
  for(int i=0; i<m->nTasks; ++i){
    m->tasks[i] = new Task;
    read(0, m->tasks[i], sizeof(Task));
  }for(int i=0; i<m->nStats; ++i){
    m->stats[i] = new Stat;
    read(0, m->stats[i], sizeof(Stat));
  }
}

一个进程创建消息并打印它,然后另一个进程读取它,修改它,然后再将它打印到第一个进程(如环),依此类推。

同样,我需要write/read而不修改任何struct。感谢。

1 个答案:

答案 0 :(得分:0)

您的错误是由于对read / write的错误调用造成的,例如您写道:

write(STDOUT_FILENO, m->tasks[i], sizeof(Task));

但写入的第二个参数应该是一个地址,而task[i]Task而不是地址。所以改为:

write(STDOUT_FILENO, m->tasks+i, sizeof(Task));

write(STDOUT_FILENO, &(m->tasks[i]), sizeof(Task));

read的相同评论。

不要担心&#34;协议&#34;,因为你在同一台机器上使用本地通信进行本地通信,用同一种语言编写,一切正常,直到......

---- ---- EDIT

但是你需要发送(至少)任务和统计数量,执行:

write(STDOUT_FILENO, m, sizeof(Message))

是错误的,因为它不足以确定另一端的数组大小。你需要发送它们:

write(STDOUT_FILENO, m->nTasks, sizeof(m->nTasks));
write(STDOUT_FILENO, m->nStats, sizeof(m->nStats));

并相应地阅读它们。