免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4538 | 回复: 15
打印 上一主题 下一主题

perl system怎么捕获ctrl+z? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-29 12:22 |只看该作者 |倒序浏览
在perl里面,我用system调用了一个命令,但是用户在这个命令的执行过程中会有ctrl+z这种行为来想退出程序,怎么在perl脚本中来捕获和处理这种行为?

论坛徽章:
0
2 [报告]
发表于 2012-03-29 13:27 |只看该作者
ctrl+z不是退出程序吧

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
3 [报告]
发表于 2012-03-29 14:43 |只看该作者
$SIG{"SIGTSTP "}好像也不行

论坛徽章:
0
4 [报告]
发表于 2012-03-29 18:50 |只看该作者
$SIG{INT}

试下捕捉这个信号

论坛徽章:
0
5 [报告]
发表于 2012-03-30 13:52 |只看该作者
回复 3# bikong0411


    在perl这个主进程里面捕获$SIG{"SIGTSTP "}和 $SIG{"INT"}是可以处理主进程中的ctrl+z和ctrl+c的。
   但是在system这个命令实际上是重新创建了一个进程,所以在主进程里捕获子进程里的信号实际上是没有起作用的。

论坛徽章:
0
6 [报告]
发表于 2012-03-30 13:53 |只看该作者
回复 4# Cu_fans

在perl这个主进程里面捕获$SIG{"SIGTSTP "}和 $SIG{"INT"}是可以处理主进程中的ctrl+z和ctrl+c的。
   但是在system这个命令实际上是重新创建了一个进程,所以在主进程里捕获子进程里的信号实际上是没有起作用的。
   

论坛徽章:
0
7 [报告]
发表于 2012-03-30 14:04 |只看该作者
本帖最后由 sjdy521 于 2012-03-30 14:04 编辑

回复 6# chgan100


    主进程,子进程都是属于一个进程组的
    一个信号整个进程组都应该是可以捕获到的

另外看楼主的意思,也是在主进程中捕获终端的信号,而不是捕获子进程的信号啊。

论坛徽章:
0
8 [报告]
发表于 2012-03-30 14:26 |只看该作者
回复 7# sjdy521


    我有写写过一个程序是:在等待用于输入的过程中,输入y继续,输入n退出,但是很多用户就不看提示,强制用ctrl+c或者ctrl+z或者有的更干脆用关掉ssh这种方式来退出,在这种情况下我捕获了$SIG{"SIGTSTP "}和 $SIG{"INT"}这两个信号是成功了。

  但是在另外一种情况是:主进程运行过程中,我用system调用了另外一个perl命令,在这个perl命令还在运行过程中用户使用ctrl+z想停止这个perl命令的运行并且退出整个程序。这种情况下在主进程里捕获$SIG{"SIGTSTP "}信号没有捕获成功。

举例说明:
下面这种情况是成功了:如果有ctrl+c或者ctrl+z行为就会调用errorsub函数。
###处理循环输入
sub cycinput
{
print RED,"\n\n\n*********************************************************************************\n",RESET;
print RED,"**如果要继续修改配置文件请输入Y或者y,如果不需要修改其他配置请输入n或N直接将改好的配置同步到服务器。\n",RESET;
print RED,"**如果没有输入n或N的话就重启服务则配置不会在服务器端生效,请注意!\n",RESET;
print RED,"**如果需要退出请输入q或Q,这个时候修改的配置会在部署平台生效,但是并没有同步到服务器\n",RESET;
print RED,"**如果要重启系统,请运行命令tremotecmd重启,谢谢。\n",RESET;
$SIG{TERM}=$SIG{INT}=$SIG{TSTP}=\&errorsub;
chomp($iscontinue=<STDIN>);

下面这种情况是不成功的:如果有ctrl+c或者ctrl+z行为就会直接退出
$iserr=system("export DEPLOY_PASSWORD=xxxx;/wls/bankdplysys/tools/deploytool dremotecmd -s $system -a $action |tee /home/banktest/logs/toperate.log/$system/$tremotecmdlog");
$SIG{TERM}=$SIG{INT}=$SIG{TSTP}=$SIG{HUP}=\&errorsub;

论坛徽章:
0
9 [报告]
发表于 2012-03-30 14:32 |只看该作者
回复 8# chgan100


    额,怎么感觉讨论的东西和这个帖子的主题越来越远了。。
你第二个例子里,直接system一个子进程去执行命令,而在这个子进程中你根本没做信号捕获处理呀,你只在主进程里做了捕获处理呀。
主进程被咔嚓了,子进程当然也会被干掉

论坛徽章:
0
10 [报告]
发表于 2012-03-30 14:36 |只看该作者
回复 8# chgan100


    我觉得楼主本来的意思就是怎么在主程序里捕获ctrl+z终止掉主进程,顺便也把system的子进程也干掉,不是讨论怎么样单单只干掉system子进程里的命令呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP