2016-05-30 114 views
-1

我有一些进程通过管道连接,所以stdout从一个是另一个stdin,反之亦然。我需要通过这个struct Message通过标准输入和标准输出,但我无法设法做到这一点。C++ - 进程之间发送消息

的结构:

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

我刚刚定义了两个管道,使用了'dup2',因此stdin和stdout被重定向,就是这样。该协议应该如何定义?这就是我要问的原因,因为我没有这方面的经验。 – sant016

+0

@ sant016查找关于_data de-/serialization_以及来自相应库的支持。 –

回答

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

不要担心“协议”,因为你使用的过程之间的本地通信,同一台机器上,写在相同的语言时,一切都很好,直到...

----编辑 - ---

但你需要发送(至少)的任务和统计的数量,这样做的:

write(STDOUT_FILENO, m, sizeof(Message)) 

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

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

并相应地读取它们。

+0

为什么这是不好的建议有很多原因。即使在同一台机器上,您仍然需要指定数据的格式。否则,当它不起作用时,根本不可能知道哪一端出现故障。另外,仍然不能保证对方能够理解数据的原因很多,包括数据可能没有固定的大小,比如他的'Message'结构。 –

+0

你说得对,他没有发送任务和统计数字。 –

+0

感谢您的回答。 嗯..直到...? – sant016