我有一个父C进程,它创建一个子tcl进程并重定向子进程的stdin / stdout与父进程交互。它似乎工作正常,但有一部分孩子永远不会收到父母接受的东西。如果任何人能够发现导致这种情况的错误,我将不胜感激。
家长发送代码:
fprintf(write_to, "%s",outmsg.data); //Received by child
bzero ((char *) &inmsg, sizeof (inmsg));
getmsg (sock, &inmsg);
if (ntohl (inmsg.type) != MATCH)
protocol_error (MATCH, &inmsg);
strncpy (opphandle, inmsg.data, maxSize);
opphandle[maxSize] = '\0';
fprintf (write_to,"%s",opphandle); //Received by child
fprintf (write_to,"%s",inmsg.board); //Not Received by child
inmsg中的board和data字段都是char []类型。
儿童接收代码:
set handle [gets stdin] //Received
set ohandle [gets stdin]//Received
set myShape [gets stdin]//Not received
注意,当使用ctrl + C杀死父级时,孩子认为它接收到了myShap的输入,然后使用myShape执行ctrl + C.
同样,孩子的stdin和stdout已被重定向,以便stdin来自父级,stdout会转到父级。
答案 0 :(得分:0)
gets
命令等待换行符。
outmsg.data和opphandle很可能以换行符结尾("\n"
或"\r"
或"\r\n"
)。它可以解释为什么前两个gets
有效。
检查inmsg.board
是否以换行符结尾。如果没有,你可以简单地做:
fprintf (write_to,"%s\n",inmsg.board);
为了提高稳健性,最好在发送前删除尾随换行符串。然后在fprintf()
中再次添加换行符,如上例所示。这是为了避免额外换行意外导致您的tcl脚本将空行读取为数据的情况。
另一种方法是在tcl脚本中实现适当的扫描器/解析器以忽略空行。