gpt4 book ai didi

perl - 为什么 Perl 的 sysopen 报告成功但是 $!有错误吗?

转载 作者:行者123 更新时间:2023-12-01 07:08:20 25 4
gpt4 key购买 nike

我的 sysopen 失败:

sysopen(DEV, "/dev/ttyS0", O_NONBLOCK|O_RDONLY)

返回1,表示成功!那么,为什么 $!有错误“非法搜索”(在调用之前它是 undef)
before sysopen $!:
after sysopen $!: Illegal seek

编辑:
这是完整的脚本:(使用实际的 O_NONBLOCK|O_RDONLY 值 2048)
 #!/usr/bin/perl -w
use Device::SerialPort;
my $ob;

$ob = new Device::SerialPort("/dev/ttyS0");

print $!, "\n";
$! = 0;

my $ret = sysopen(DEV, "/dev/ttyS0", 2048);

print $!, "\n";
$! = 0;

print "ret from sysopen: ", $ret, "\n";
#my $dev = <DEV>;

打印出来:
./文件句柄.pl
非法寻求
非法寻求
来自 sysopen 的 ret:1

最佳答案

这就是 C errno 的方式变量作品。引用 man errno :

Its value is significant only when the return value of the call indicated an error (i.e., -1 from most system calls; -1 or NULL from most library functions); a function that succeeds is allowed to change errno.



$! 只是 Perl 对 errno 的接口(interface),并且有 same behavior :

This means that the value of $! is meaningful only immediately after a failure



您必须检查 sysopen 的返回值来判断它是否失败。如果失败, $!会告诉你失败的原因,但你不能使用 $!确定它是否失败(除非您使用的特定功能被记录为成功时将 $! 设置为 0。大多数都没有,包括 sysopen )。

关于perl - 为什么 Perl 的 sysopen 报告成功但是 $!有错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3893019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com