免费注册 查看新帖 |

Chinaunix

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

如何判断超时呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-14 17:44 |只看该作者 |倒序浏览
比如 程序执行到某条语句的时候, 这条语句一直没有返回
如果判断超时呢 ?

$result = &fun(a,b); # 这一句 有时会一直卡着  , 如何判断这句是否超时呢 ?

论坛徽章:
0
2 [报告]
发表于 2008-08-14 20:03 |只看该作者
Benchmark 模块里面的方法  timethis ($count, "code");
可以控制 code 部分代码至少运行$count 秒

有没有方法可以控制 code部分代码最多运行$count 秒

或者这样的函数需要怎么写 , 请高手给个思路。

论坛徽章:
0
3 [报告]
发表于 2008-08-14 20:41 |只看该作者
已经解决了
fork 一个进程就可以了
#!/usr/bin/perl  -w


use strict;
use warnings;
use POSIX;
$SIG{CHLD} = 'IGNORE';
my $isFinished = 0;
defined(my $child = fork()) or die "cant fork";
my $pid = $$;
if($child == 0) {
                
                sleep 3;
                if($isFinished == 0) {
                        print "timeout , stop running..";
                       
                }
                exit ;
}


$isFinished = &fun();
exit;

论坛徽章:
0
4 [报告]
发表于 2008-08-14 21:16 |只看该作者
看不懂
假如3s后父进程的&fun()还没返回,那么
子进程print "timeout , stop running..",然后子进程exit,
父进程的&fun()不是还在进行啊!!
不过有个提示作用……呵呵,kill掉父进程吧,哈哈……

论坛徽章:
0
5 [报告]
发表于 2008-08-14 21:48 |只看该作者
恩 是啊 , 如果3秒还没有返回  就KILL 掉父进程

论坛徽章:
0
6 [报告]
发表于 2008-08-14 23:08 |只看该作者
怎么kill的,那个语句怎么写。。

论坛徽章:
0
7 [报告]
发表于 2008-08-14 23:11 |只看该作者

回复 #6 hdc1112 的帖子

上面我的代码里面 my $pid = $$;  这一句往上移一行
然后 print 语句下面 kill 9,$pid; 就可以了

论坛徽章:
0
8 [报告]
发表于 2008-08-15 01:21 |只看该作者

还是不行, 有问题

#!/usr/bin/perl  -w


use strict;
use warnings;
use POSIX;
$SIG{CHLD} = 'IGNORE';

my $isFinished = 0;
sub fun {
        $isFinished = 1;
        print "Im $$ too ,the value has been changed to $isFinished..\n";
}

defined(my $child = fork()) or die "cant fork";
if($child == 0) {
                sleep 3;
                print "Im the child my pid $, I found the value still is $isFinished \n";
                exit ;
}

print "I m $$ running the child supposed sleeping . the value is $isFinished\n";
fun();
exit;




是不是因为sleep的原因  ?
那要如何判断段代码执行是否超时呢?
希望实现的是判断一个进程 超时后重启    Linux下

论坛徽章:
0
9 [报告]
发表于 2008-08-15 22:54 |只看该作者
使用alarm 函数可以指定时间对进程发送ALRM信号
然后 用die来对ALRM处理抛出异常,进程里catch处理这个异常就可以了

$SIG{ALRM} = sub { die "timeout" };

eval {
    alarm(5);
    while(1) {
                print "Im running....\n";
        }
    alarm(0);
};

if ($@) {
    if ($@ =~ /timeout/) {
        print "hey , timeout!\n";                    # timed out; do what you will here

    } else {
        alarm(0);           # clear the still-pending alarm

        die;                # propagate unexpected exception

    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP