我有一些通过管道连接的进程,因此一个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
。感谢。
答案 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));
并相应地阅读它们。