为什么 Perl 是 $?返回分叉进程的退出代码的错误值?

发布于 2024-09-02 18:39:13 字数 540 浏览 5 评论 0原文

考虑这个在 Perl 中 fork() 然后等待子进程死亡的简单示例:

#!/usr/bin/perl

use strict;
use warnings;

if (fork() == 0) {
        exit(1);
}

waitpid(-1,0);

print $?;

在 Solaris 10 上运行脚本,得到以下结果:

$ perl test.pl
256

我怀疑 的值正在向上移动,因为当我在子进程中执行 exit(2) 时,输出变为 512

我似乎找不到 Perl 的 waitpid 中的记录。这是我的系统上的错误还是我做错了什么?

Consider this trivial example of fork()ing then waiting for a child to die in Perl:

#!/usr/bin/perl

use strict;
use warnings;

if (fork() == 0) {
        exit(1);
}

waitpid(-1,0);

print $?;

Running the script on Solaris 10 I get this result:

$ perl test.pl
256

I suspect the values of are being shifted upwards because when I do exit(2) in the child, the output becomes 512.

I can't seem to find this documented in perl's waitpid. Is this a bug on my system or am I doing something wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

残月升风 2024-09-09 18:39:13

它记录在 perlvar 手册页的 $? 部分中。

即真正的退出代码是 $? >>> 8..

It's documented in the $? section of the perlvar man page.

i.e. the real exit code is $? >> 8.

挽手叙旧 2024-09-09 18:39:13

孩子可能甚至没有机会调用exit。因此,$? 包含的信息不仅仅是 exit 参数。

if    ( $? == -1  ) { die "Can't launch child: $!\n"; }
elsif ( $? & 0x7F ) { die "Child killed by signal ".( $? & 0x7F )."\n"; }
elsif ( $? >> 8   ) { die "Child exited with error ".( $? >> 8 )."\n"; }
else                { print "Child executed successfully\n"; }

system 的文档对此进行了更清晰的记录。

The child might not even have gotten to call exit. As such, $? packs more information than just the exit parameter.

if    ( $? == -1  ) { die "Can't launch child: $!\n"; }
elsif ( $? & 0x7F ) { die "Child killed by signal ".( $? & 0x7F )."\n"; }
elsif ( $? >> 8   ) { die "Child exited with error ".( $? >> 8 )."\n"; }
else                { print "Child executed successfully\n"; }

This is documented more clearly in system's documentation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文