【发布时间】:2023-03-22 18:01:01
【问题描述】:
我有一个用FILE *telnet = popen("telnet server", "w" 打开的管道。如果 telnet 一段时间后因为找不到服务器而退出,则管道从另一个极端关闭。
然后我预计会在fprintf(telnet, ...) 或fflush(telnet) 调用中出现一些错误,但是相反,我的程序突然在fflush(telnet) 处死掉而没有报告错误。这是正常行为吗?为什么会这样?
【问题讨论】:
-
您的程序是否检查
fflush的返回值并在适当的时候打印错误?如果不是,则无法打印错误消息是“正常行为”。 -
我检查 fprintf 返回 >= 0。 fflush() 在 telnet 退出之前返回 0,在 telnet 退出后,对 fflush() 的调用根本不返回(我有
printf("c\n"); if (fflush(telnet)) {printf("a\n"); getchar(); return -1;} printf("b\n"); getchar();,并且只有c被打印);它的作用就像是调用了 exit()。 -
你收到
SIGPIPE了吗? -
如果你在管道另一端没有进程读取数据的情况下写入管道,你会得到一个 SIGPIPE 信号让你知道,而 SIGPIPE 的默认行为是退出 (没有核心转储,但有偏见地退出)。您可以将处理程序设置为
SIG_IGN,在这种情况下,您的写入操作应该会因错误而失败,而不是终止。或者您可以设置更精细的信号处理。 -
@WilliamPursell 可能。我不处理信号,所以我不知道,但有道理。终端不显示任何内容。