Windows 中的 Perl Kill(0, $pid) 总是返回 1

2024-04-10

我正在尝试制作一个 Perl 脚本来运行 Windows 中的一组其他程序。我需要能够捕获进程的 stdout、stderr 和退出代码,并且需要能够查看进程是否超出了分配的执行时间。 现在,我的代码的相关部分如下所示:

...
        $pid = open3($wtr, $stdout, $stderr, $command);
        if($time < 0){
            waitpid($pid, 0);
            $return = $? >> 8;
            $death_sig = $? & 127;
            $core_dump = $? & 128;
        }
        else{
            # Do timeout stuff, currently not working as planned
            print "pid: $pid\n";
            my $elapsed = 0;
            #THIS LOOP ONLY TERMINATES WHEN $time > $elapsed ...?
            while(kill 0, $pid and $time > $elapsed){
                Time::HiRes::usleep(1000);  # sleep for milliseconds
                $elapsed += 1;
                $return = $? >> 8;
                $death_sig = $? & 127;
                $core_dump = $? & 128;
            }
            if($elapsed >= $time){
                $status = "FAIL";
                print $log "TIME LIMIT EXCEEDED\n";
            }
        }
        #these lines are needed to grab the stdout and stderr in arrays so 
        #  I may reuse them in multiple logs
        if(fileno $stdout){
            @stdout = <$stdout>;
        }
        if(fileno $stderr){
            @stderr = <$stderr>;
        }
...

如果一切正常$time = -1(不需要超时),但系统认为kill 0, $pid始终为 1。这使得我的循环在允许的整个时间内运行。

为了清楚起见,一些额外的细节:

  • 这是在 Windows 上运行的。
  • 我知道我的进程确实终止了,因为我已经得到了所有预期的输出。
  • Perl 版本:这是为 MSWin32-x86-多线程构建的 perl,v5.10.1 (有 2 个注册补丁,请参阅 perl -V 了解更多详细信息)版权所有 1987-2009,Larry Wall ActiveState 提供的二进制版本 1007 [291969]http://www.ActiveState.com http://www.ActiveState.com建成于 2010 年 1 月 26 日 23:15:11
  • 我感谢你的帮助:D

对于未来可能有类似问题的人我让代码可以工作,这里是修改后的代码部分:

        $pid = open3($wtr, $stdout, $stderr, $command);
        close($wtr);
        if($time < 0){
            waitpid($pid, 0);
        }
        else{
            print "pid: $pid\n";
            my $elapsed = 0;
            while(waitpid($pid, WNOHANG) <= 0 and $time > $elapsed){
                Time::HiRes::usleep(1000);  # sleep for milliseconds
                $elapsed += 1;
            }

            if($elapsed >= $time){
                $status = "FAIL";
                print $log "TIME LIMIT EXCEEDED\n";
            }
        }
        $return = $? >> 8;
        $death_sig = $? & 127;
        $core_dump = $? & 128;
        if(fileno $stdout){
            @stdout = <$stdout>;
        }
        if(fileno $stderr){
            @stderr = <$stderr>;
        }
        close($stdout);
        close($stderr);

代替kill 0, use waitpid $pid, WNOHANG http://perldoc.perl.org/functions/waitpid.html:

use POSIX qw( WNOHANG );

if (waitpid($pid, WNOHANG) > 0) {
   # Process has ended. $? is set.
   ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 中的 Perl Kill(0, $pid) 总是返回 1 的相关文章

  • Crystal lang 进程是否可以更改其用户(euid/uid)?

    如果 Crystal 语言进程以 root 身份运行 是否可以将其 euid uid 更改为其他内容 例如 old euid old ui Process euid Process uid Process euid someone else
  • Perl 初学者:如何查找/替换文件中的 ASCII 字符?

    我对 Perl 完全陌生 我认为这将是解决我的简单任务的最佳语言 我需要将二进制文件转换为可读的文件 并且需要查找和替换字符串 例如 x00 x39 into x09 选项卡 或类似的东西 从 bash 开始 我从以下内容开始 效果很好 p
  • 使用带有 _O_U8TEXT 的 setmode 处理 unicode 时 C++ 崩溃

    我尝试打印 unicode 的是 setmode fileno stdout O U8TEXT string str u8 unicode hangul cout lt lt str lt lt endl 我使用 setmode 来正确显示
  • 在 Windows 上安装 MonoDevelop:满足 Gtk# 要求的解决方法?

    我已经安装了Mono 版本2 11 4 在我的Windows 7系统上 现在我打算安装单一开发 版本 3 0 4 7 然而 当我开始单一开发安装程序我收到以下错误消息 并且安装终止 好的 这可以通过获取轻松解决Gtk 安装程序来自here
  • 无法从 GetProcessId(.. hWnd) (pInvoke) 中提取 processID

    我使用以下方法 DllImport kernel32 dll SetLastError true static extern int GetProcessId IntPtr hWnd 尝试获取正在运行的进程的 processId 我拥有的唯
  • 如何在 Perl 中序列化数组引用数组?

    Perl 有很多用于序列化数据的模块 我不知道该选择哪一个 我需要将以下数据序列化为字符串 以便将其放入数据库中 my categories Education Higher Education Colleges Schooling Col
  • 如何使用 Perl 从纯文本中提取 URL?

    我需要 Perl 正则表达式来解析纯文本输入并将所有链接转换为有效的 HTML HREF 链接 我已经尝试了在网上找到的 10 个不同版本 但没有一个可以正常工作 我还测试了 StackOverflow 上发布的其他解决方案 但似乎都不起作
  • 如何抑制输出并检查命令是否成功?

    我正在尝试编写一个 powershell 脚本来测试 MySQL 登录是否成功 检查是否发生错误 我还想抑制命令的所有输出 成功或不成功 这些是我尝试过的事情 mysql u root password mypass e show data
  • 将文件读入 Perl 中的变量 [重复]

    这个问题在这里已经有答案了 可能的重复 在 Perl 中将文件转换为字符串的最佳方法是什么 https stackoverflow com questions 206661 what is the best way to slurp a f
  • 以字符集安全的方式获取 Windows 上的进程列表

    这个帖子 https stackoverflow com questions 54686 how to get a list of current open windows process with java给出了一个在 Windows 下
  • XP 和 Vista 之间使用 Winsock API 的 UDP 多播差异

    Windows XP 和 Windows Vista 之间设置 UDP 多播套接字所需的实现似乎有所不同 具体来说 在 Windows XP 下 您must call bind 在您可以引用任何特定于多播的套接字选项之前 然而 在windo
  • Windows 服务和 Windows 进程有什么区别?

    是什么不同之处窗户之间service和一个窗户process 服务是真正的 Windows 进程 没有区别 服务的唯一特殊之处在于它由操作系统启动并在单独的会话中运行 一种独立的方式 可防止其干扰桌面会话 传统上命名为daemon http
  • 如何将 CLI 应用程序作为 Windows 服务运行?

    假设我有一个第三方应用程序 它执行后台工作 但将所有错误和消息打印到控制台 这意味着 目前我们必须保持用户登录到服务器 并在每次重新启动时重新启动应用程序 双击 不太酷 我有点确定 有一种简单的方法可以做到这一点 通用服务包装器 可以使用日
  • Emacs 23.1.50.1 在 Windows XP 上随机挂起 6-8 秒

    我的 Windows XP 机器上有 EmacsW32 23 1 50 1 emacs 运行 它随机挂起 5 到 8 秒 非常令人沮丧 有人有解决办法吗 我什至尝试使用来自 gnu ftp 站点的 emacs win32 二进制文件 23
  • 使用 php 运行 ipconfig 命令

    我使用这段代码来了解访问者 客户 的一些信息 它一直在我的 Xampp 虚拟服务器上运行 但我无法在我的主服务器 主机 上运行 我只看到一个空白页 info system ipconfig all echo info 这可能对你有帮助 服务
  • 如何以编程方式重新启动 Windows 资源管理器进程

    我正在开发 Windows shell 扩展 不幸的是 在更改 DLL 时 我必须重新启动 Windows 资源管理器 因为它将 DLL 保留在内存中 我从 Dino Esposito 找到了这个程序 但它对我不起作用 void SHShe
  • 如何在 Perl 脚本中递归查找文件/文件夹?

    我有一个 perl 脚本 我编写了该脚本来递归地搜索 Windows 文件夹中的文件 我输入搜索文本作为 perl 脚本运行时参数 以查找名称中包含此文本的文件 perl脚本如下 use Cwd file1 ARGV 0 res1 glob
  • DBI:在 eval 中引发错误

    这个问题参考了池上的评论 But if you re going to put an eval around every statement just use RaiseError gt 0 in this thread https sta
  • shell进程的并行执行

    有没有一个工具可以在 Windows 批处理文件中并行执行多个进程 我发现了一些有趣的 Linux 工具 parallel http mi eng cam ac uk er258 code parallel html and PPSS ht
  • 以系统帐户运行exe

    我正在尝试将我的 c exe 作为系统帐户运行 我怎样才能做到这一点 我试过了

随机推荐

  • 如何生成一定范围内的加密安全随机整数?

    我必须为生成密码的程序生成给定范围内的统一 安全的随机整数 现在我用这个 RNGCryptoServiceProvider rng new RNGCryptoServiceProvider byte rand new byte 4 rng
  • ASP.NET MVC GetFullHtmlFieldId 未返回有效 ID

    我已经看过了 但它对我没有帮助 GetFullHtmlFieldId 返回错误的 id 属性值 https stackoverflow com questions 15457883 getfullhtmlfieldid returning
  • Excel 中的排序保持风格?

    我得到了一个带有交替背景的 Excel 文件 以提高可读性 Row 1 White Background Row 2 Gray Background Row 3 White Backgrund 我使用 VBA 函数对 Excel 文件的内容
  • Rust 中模式匹配中的类型注释?

    我正在深入研究 Rust 特别是优雅地处理错误 但我在类型推断方面遇到了一些麻烦 extern crate mysql use mysql as my fn main my test fn my test gt Result lt my E
  • Oracle SQL 将日期格式从 DD-Mon-YY 转换为 YYYYMM

    我要比较 2 个表中的日期 但问题是一个表的日期采用 DD Mon YY 格式 另一个表的日期采用 YYYYMM 格式 我需要将它们都设为 YYYYMM 进行比较 我需要创建这样的东西 SELECT FROM offers WHERE of
  • 为什么元素在警报之前不显示?

    在这个简单的例子中https jsfiddle net 4rsje4b6 1 https jsfiddle net 4rsje4b6 1 为什么是 test在警报出现之前元素未显示 jQuery 不应该吗 css 方法是同步的吗 test
  • 如何告诉 TSC 脚本文件不会共享作用域并忽略重新声明

    问题 疑问 我正在使用 VSCode 的 TS 驱动的 JS 检查功能来对一堆 JS 文件进行类型检查 这些文件将通过以下方式导入
  • 如何制作具有部分透明边框的任意大小的 html 元素?

    考虑下图 这应该看起来像一片边缘粗糙 有斑点 的草 这是一张 200x200 像素的 png 图像 边缘具有透明度以提供自然的外观 问题是 我正在尝试设计一个网页 我希望所有不同尺寸的各种元素都具有此背景 但我无法使用简单的 css 背景属
  • 如何向 Android 应用程序提供 Jacoco 代理?

    我正在尝试使用 Jacoco 进行手动测试来获得代码覆盖率 我正在尝试使用离线仪器 http www eclemma org jacoco trunk doc offline html http www eclemma org jacoco
  • 如何创建自己的 Haar 级联分类器以进行自定义对象检测? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想检测汽车 但可用的 xml 文件对于准确检测来说不太强大 如何创建自定义 xml 文件 我可以为任何对象创建 任何帮助 将不胜感激
  • 如何使用 JQuery 访问 WTForm

    我想请求有关访问 WTForm 字段的帮助 我有以下表格 class model bolt InputForm FlaskForm Bolt Inputs bolt size SelectField Bolt size mm choices
  • 动态初始化

    C 03标准 basic start init 第3点 states 是否动态是实现定义的 命名空间对象的初始化 8 5 9 4 12 1 12 6 1 作用域是在 main 的第一个语句之前完成的 如果 初始化被推迟到第一次之后的某个时间
  • 如何在使用 jQuery 添加新行时刷新简单的数据表

    我认为这个很简单 但我找不到与 ajax 加载的数据或数组中提供的数据无关的参考 我在现有的 HTML 表上使用 DataTables 基本代码如下 table wizard dataTable lengthChange false iDi
  • 测试使用 IntersectionObserver 的代码

    我的应用程序中有一个处理无限滚动分页的 JavaScript 组件 我正在尝试重写它以使用IntersectionObserver 如上所述here https developers google com web updates 2016
  • 为每个因子组添加单独的 vlines 到 ggplot(变量重要性随机森林的点图)

    我正在使用 ggplot2 制作随机森林中六个相关变量重要性结果的点图 我的数据 我已经使用 reshape2 将其转换为长格式 如下所示 我的真实数据集有点大 Factor Group Value Gender A 0 000127 Ag
  • 如何在 emacs elisp 中查找哪个文件提供该功能

    目前我正在使用加载历史记录变量来查找某个功能来自的文件 假设找到该文件的特征gnus来自 我在暂存缓冲区中执行以下代码 该代码在单独的行中连续打印文件名和符号 dolist var load history princ format s n
  • 正则表达式和 GWT

    我的问题是 在GWT中使用正则表达式有没有好的解决方案 例如 我对 String split regex 的使用不满意 GWT 将代码翻译为 JS 然后将正则表达式用作 JS 正则表达式 但我无法使用 Java Matcher 或 Java
  • 使应用程序在越狱设备上自行重启

    我的 iOS 应用程序是否可以在每次用户访问其主屏幕时自动重新启动 这是针对越狱设备的 该应用程序不适用于应用程序商店 一般来说 鉴于应用程序外部的特定用户操作 如何让我的应用程序重新启动 加速度计 如果您只想让您的应用程序在遇到某些加速计
  • 使用其名称来响应渲染组件

    我正在试验 React js 它运行得非常好 我想知道是否可以将类注入到其他类中 如下所示 var Container React createClass render function lt this props implComponen
  • Windows 中的 Perl Kill(0, $pid) 总是返回 1

    我正在尝试制作一个 Perl 脚本来运行 Windows 中的一组其他程序 我需要能够捕获进程的 stdout stderr 和退出代码 并且需要能够查看进程是否超出了分配的执行时间 现在 我的代码的相关部分如下所示 pid open3 w