使用securecrt启动程序,如何检测终端断连

失散糖 2019-01-11 02:45:38
发生终端断连时(比如,拔网线的时候;再比如,关闭终端的时候),过一段时间程序会挂起,如何防止程序挂起?

用securecrt里的telnet模式,通过网线连接,启动测试程序,程序开头fork之后,父进程退出,这样我可以继续在终端敲其他命令。
子进程利用usleep制作1秒的软定时,在/tmp文件夹下不断打印当前时间,并在终端打印同样的时间。
终端貌似有缓存,所以为了快速填满缓存,每次多打印很多无意义的字符。
再用securecrt里的串口模式,通过串口连接,不断用tail命令监视/tmp文件夹下的输出文件。
我发现,刚刚拔掉网线之后,文件继续变化,但是大约15秒之后,文件不再变化了,推测程序挂起了。
重新插上网线,程序能活过来,仅仅是打印的时间缺失了一段。


测试程序如下:
#include <stdio.h>
#include <time.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
pid_t child_pid = fork ();
if (child_pid != 0)
{
printf ("child_pid = %d\n", child_pid);
_exit (0);
}

FILE *stream = fopen ("/tmp/test.txt", "w");
if (stream == NULL)
{
return -1;
}

time_t last_rawtime = 0;
while (1)
{
usleep (100000);
time_t rawtime = time (NULL);
if (last_rawtime == rawtime)
{
continue;
}
last_rawtime = rawtime;
struct tm timeinfo = { 0 };
localtime_r (&rawtime, &timeinfo);
fprintf (stream, "%02u:%02u:%02u\n",
timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
fflush (stream);
printf ("%02u:%02u:%02u\n",
timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);

for (int i = 0; i < 24; i++)
{
printf (
"---------------- "
"---------------- "
"---------------- "
"---------------- "
"---------------- "
"---------------- "
"----------------\n");
}
}

return 0;
}

...全文
496 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
失散糖 2019-01-25
  • 打赏
  • 举报
回复
现在在弄别的东西,没法仔细试验,总之先记下这些思路好了
sazhufa 2019-01-15
  • 打赏
  • 举报
回复
nohup不行的推测原因是: 因为在终端上打印,也就是stdout是跟终端输出缓存有关了,当网线拔掉后,输出的文本流卡住了。
如果你一定要终端打印的输出看得见,就只能用终端复用技术了,相关的工具是screen最常用:

1. 运行screen; 2. 在screen中启动程序; 3.Ctrl-A d 脱离screen; ...这时随便怎么断开/退出登录会话都可以了。
4. 重新登录, 运行screen -r 重新联结screen, 就可以看到你的程序在继续正常输出了。


你的程序的运行方式其实类似是daemon, 但正规的daemon程序是不输出信息的, 或者把stdout/stderr都重定向。

再举个例子:
setsid myscript.sh >/dev/null 2>&1 < /dev/null & 比如这个,就可以把一段script直接放到后台跑了, 第一个/dev/null你换成其它文件名,再用tail -f 你的文件名 可以看到文件内容变化.
northwesternwind 2019-01-14
  • 打赏
  • 举报
回复
要编程实现你这个功能有点儿复杂。感觉简单的办法就是把输出写到文件中。这样程序就不受终端是否断掉的影响。同时,用tail -f 显示文件内容。效果差不多一样
失散糖 2019-01-14
  • 打赏
  • 举报
回复
引用 1 楼 northwesternwind 的回复:
代码中调用setsid().或者用nohup启动程序。 百度关键字“linux 与终端脱离关系"
我希望的,是用终端启动程序,能够看到正常打印;拔网线或者用别的方式断掉终端,打印可以停,但是程序不能挂,注意,打印跟正常业务是绞在一起的;重新接上网线,打印能够恢复
失散糖 2019-01-14
  • 打赏
  • 举报
回复
setsid我没试过,不过nohup我上周试过了,与终端脱离关系之后,终端打印消失了,但是我希望看到终端打印,所以这是不行的
northwesternwind 2019-01-12
  • 打赏
  • 举报
回复
代码中调用setsid().或者用nohup启动程序。
百度关键字“linux 与终端脱离关系"

23,216

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧