2010-04-28 38 views
7

Neden çıkış kodu $?, Perl'de sekiz ile değiştirdiğimde, -1 olmasını beklediğimde 255 aldım?Perl'de -1 yerine çıkış kodu 255 neden?

+6

Belki de çıkış kodunun neden -1 olmasını beklediğinizi açıklayabilirsiniz. –

+3

Lütfen Perl kodunu göster. Hangi program/betik çıkış kodunu yayar, hangi senaryoda rapor eder? – lexu

+4

'perl -e" exit -1 "; echo $? '=> 255. – jrockway

cevap

20

'wait()' tarafından döndürülen çıkış durumu 16 bitlik bir değerdir. Bu 16 bitten yüksek sıralı 8 bit, 'exit()' ile döndürülen değerin düşük sıra 8 bitinden veya main()'dan döndürülen değerden gelir. Program doğal olarak ölürse, 16'nın düşük dereceli 8 biti sıfırdır. Program, sinyal nedeniyle ölürse, düşük sıra 8 bit, sinyal numarasını kodlar ve bir çekirdek dökümü olup olmadığını belirten bir bit. Bir sinyal ile, çıkış durumu sıfır olarak kabul edilir - kabuk gibi düşük dereceli bitleri bir hata olarak yorumlama eğilimi olan programlar gibi.

15  8 7  0 Bit Position 
+-----------------+ 
| exit | signal | 
+-----------------+ 

En makineleri aslında 32-bit tamsayı, 16-bit değeri saklamak ve bu işaretsiz aritmetik ile işlenir. İşlemin 'exit (-1)' ile çıkması durumunda, 16 bitlik yüksek bit 8 biti 1 olabilir, ancak 8 bit ile sağa kaydırıldığında 255 olarak görünecektir.

Değeri gerçekten imzalı bir miktara dönüştürmek istiyorsanız, 16 bit'e göre biraz bitlikli bir işlem yapmanız gerekir.

$status >>= 8; 
($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status; 

da SO 774048 ve SO 179565 bakınız.

0

Hangi yolu değiştiriyorsunuz? Lütfen bir kod örneği verin. Ayrıca

:

perldoc -f system 

$ ile ne yapacağını çok kolay bir anlama örnek verir? Ayrıca

, http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html

Çık değerleri Sizin aslında biraz fikir vermelidir bilgisayar tarafından saklanır nasıl negatif değerler ile kombine şiftinglerde 0 ve 255 arasında olmalıdır.

+0

Ben 8 bit – syker

10

Perl wait(2) aşağıdaki açıklama vardır WEXITSTATUS makro Cı çalışma zamanı kütüphanesi ile aynı şekilde bir alt işlemi çıkış kodunu verir: Burada

 
    WEXITSTATUS(status) 
      evaluates to the least significant eight bits of the return code 
      of the child which terminated, which may have been set as the 
      argument to a call to exit() or as the argument for a return 
      statement in the main program. This macro can only be evaluated 
      if WIFEXITED returned non-zero. 

önemli bir kısmı sekiz bit en az önemli olup.

 
    $?  The status returned by the last pipe close, backtick (‘‘) com- 
      mand, successful call to wait() or waitpid(), or from the sys- 
      tem() operator. This is just the 16-bit status word returned 
      by the wait() system call (or else is made up to look like it). 
      Thus, the exit value of the subprocess is really ("$? >> 8"), 
      and "$? & 127" gives which signal, if any, the process died 
      from, and "$? & 128" reports whether there was a core dump. 

çıkış kodu negatif sayılar için burada hiçbir özel işlem yok: aşağıdaki gibi perlvar adam sayfa $? açıklanır 255 çıkış kodu alıyorsanız nedeni budur.

+0

Awesome cevabı ile onu değiştiriyordum! – syker

İlgili konular