TCL坚持得到

时间:2015-04-30 03:45:54

标签: c tcl io-redirection

我有一个父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会转到父级。

1 个答案:

答案 0 :(得分:0)

gets命令等待换行符。

outmsg.data和opphandle很可能以换行符结尾("\n""\r""\r\n")。它可以解释为什么前两个gets有效。

检查inmsg.board是否以换行符结尾。如果没有,你可以简单地做:

fprintf (write_to,"%s\n",inmsg.board);

为了提高稳健性,最好在发送前删除尾随换行符串。然后在fprintf()中再次添加换行符,如上例所示。这是为了避免额外换行意外导致您的tcl脚本将空行读取为数据的情况。

另一种方法是在tcl脚本中实现适当的扫描器/解析器以忽略空行。