0

我试图理解这个 $!=0 ,我的主管在这个链接中给了我鳕鱼:http: //codepaste.ru/1374/ 但她改变了这部分鳕鱼:

    while($client || $target) {
      my $rin = "";
      vec($rin, fileno($client), 1) = 1 if $client;
      vec($rin, fileno($target), 1) = 1 if $target;
      my($rout, $eout);
      select($rout = $rin, undef, $eout = $rin, 120);
      if (!$rout  &&  !$eout) { return; }
      my $cbuffer = "";
      my $tbuffer = "";
 if ($client && (vec($eout, fileno($client), 1) || vec($rout, fileno($client), 1))) {
        my $result = sysread($client, $tbuffer, 1024);
        if (!defined($result) || !$result) { return; }
      }

对此:

while($client || $target) {
        my $rin = "";
        vec($rin,fileno($client),1) = 1 if $client;
        vec($rin,fileno($target),1) = 1 if $target;
        my($rout,$eout);
        select($rout = $rin,undef,$eout = $rin,120);
        break_pipe() if !$rout && !$eout;
        my($cbuf,$tbuf);
        if($client && (vec($eout,fileno($client),1) || vec($rout,fileno($client),1))){
            $! = 0;
            my $result = sysread($client,$tbuf,$packet_length);

我已经搜索过,但在 perl 中没有找到类似这种语法($!=0)的东西

4

3 回答 3

1

来自 Perldoc:

    $!

    When referenced, $! retrieves the current value of the C errno integer variable. 
    If $! is assigned a numerical value, that value is stored in errno . 
    When referenced as a string, $! yields the system error string corresponding to errno .

    Many system or library calls set errno if they fail, to indicate the cause of failure. 
    They usually do not set errno to zero if they succeed. 
    This means errno , hence $! , is meaningful only immediately after a failure

更多细节: http: //perldoc.perl.org/perlvar.html

于 2013-09-17T06:47:19.663 回答
0

$!包含失败时系统调用的错误号和错误消息。大概,你的新代码看起来像

$! = 0;
sysread(...);
if ($!) {
   # Error. Error message in $!
   ...
}

那是错误的。sysread没有义务$!在成功时保持原样,所以$!在调用之前改变sysread是没有用的。

如果要检查错误,请检查结果是否sysread已定义。如果不是,$!将是有意义的。

my $rv = sysread(...);
if (!defined($rv)) {
   # Error. Error message in $!
   ...
}
elsif (!$rv) {
   # End of file
   ...
}
else {
   # Data read
   ...
}
于 2013-09-17T11:24:38.690 回答
0

Yes$!是 Perl 程序执行期间可能发生的错误状态的变量

正如您的问题指出的那样,为什么$!值往往为 0

我想补充一下,

执行开始前errno ( ) 的初始值$!为零。

由于调用可能失败的其他库函数,许多库函数可以将 errno 设置为非零值。您应该假设任何库函数都可能改变 errno。

希望能帮助到你。如有任何疑问,请发表评论

于 2013-09-17T06:58:27.310 回答