繁体   English   中英

TCL挂上

[英]TCL hang on gets

我有一个父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的输入,然后以ctrl + C的myShape身份执行。

再次,子级的stdin和stdout已被重定向,以便stdin来自父级,而stdout转到父级。

gets命令等待换行符。

outmsg.data和opphandle都可能以换行符结尾( "\\n""\\r""\\r\\n" )。 它可以解释为什么前两个方法gets工作。

检查inmsg.board是否以换行符结尾。 如果没有,您可以执行以下操作:

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

为了提高鲁棒性,最好在发送前去除尾随换行符的字符串。 然后像上面的示例一样,在fprintf()再次添加换行符。 这是为了避免多余的换行符意外导致tcl脚本读取空行作为数据的情况。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM