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

C++ - Send messages between processes

本文关键字:消息 之间 进程 C++      更新时间:2023-10-16

我有一些进程通过管道连接,所以一个进程的 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置于标准输出而尝试的:

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));
  }
}
一个进程创建消息并打印它,然后

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

同样,我需要在不修改任何struct的情况下write/read它.谢谢。

您的错误是由于对 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.

不用担心"协议",因为您在同一台机器上用同一种语言编写的进程之间使用本地通信,一切都很好,直到......

----编辑----

但是您需要(至少)发送任务和统计数据的数量,执行以下操作:

write(STDOUT_FILENO, m, sizeof(Message))

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

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

并相应地阅读它们。