C++ - 在进程之间发送消息
C++ - Send messages between processes
我有一些进程通过管道连接,所以一个进程的 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));
并相应地阅读它们。
相关文章:
- GCC 警告和 gcc 错误消息之间的区别
- 在 2 个并行运行的脚本(python 和 C++)之间传递消息
- 如何使用标准库网络 TS 在服务器和客户端之间发送消息C++
- 在两个进程之间传递消息
- 如何在两个类之间发送/接收消息
- 未定义的行为和格式错误之间的区别,不需要诊断消息
- msgpack:C++和Java之间的消息传递
- C++ - 在进程之间发送消息
- 是否有任何消息总是出现在WM_LBUTTONDOWN和WM_LBUTTNUP之间
- 增强ASIO和线程之间的消息传递
- 消息在网络上的两台机器之间传递
- 如何使用两个管道在子级/父级之间发送消息
- 在到应用程序之间的消息中重复WaitForSingleObject
- 在 MFC 对话框和自己的线程上的 OpenGL 控件之间传递消息
- ZeroMQ 在节点之间创建消息缓冲区
- 使用命令文件在线程之间传递消息
- 使用互斥对象与消息在线程之间共享信息
- 在C++actors框架中在类型化参与者之间转发消息的最佳实践
- 进程之间的Windows CE集中式消息队列
- 线程消息之间的优先级