2010-04-28 27 views
7

Tại sao khi tôi thay đổi mã thoát, $ ?, trong Perl bằng tám, tôi nhận được 255 khi tôi mong đợi nó là -1?Tại sao mã thoát 255 thay vì -1 trong Perl?

+6

Có lẽ bạn có thể giải thích lý do tại sao bạn mong đợi mã thoát là -1. –

+3

Vui lòng hiển thị mã Perl. Chương trình/tập lệnh nào 'phát ra' mã thoát, kịch bản nào báo cáo nó? – lexu

+4

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

Trả lời

20

Trạng thái thoát được trả về bởi 'wait()' là giá trị 16 bit. Trong số 16 bit đó, 8 bit có thứ tự cao đến từ 8 bit thứ tự thấp của giá trị được trả về bởi 'exit()' - hoặc giá trị trả lại từ main(). Nếu chương trình chết một cách tự nhiên, các bit 8 bit thấp của 16 là tất cả không. Nếu chương trình chết vì tín hiệu, 8 bit bậc thấp mã hóa số tín hiệu và một chút cho biết liệu một kết xuất lõi có xảy ra hay không. Với một tín hiệu, trạng thái thoát được coi là zero - các chương trình như trình bao có khuynh hướng diễn dịch các bit có thứ tự thấp khác không thành một thất bại.

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

Hầu hết máy thực sự lưu trữ giá trị 16 bit trong số nguyên 32 bit và được xử lý bằng số học chưa ký. 8 bit thứ tự cao hơn của 16 có thể là tất cả 1 nếu quá trình thoát với 'exit (-1)', nhưng điều đó sẽ xuất hiện là 255 khi được dịch chuyển đúng 8 bit.

Nếu bạn thực sự muốn chuyển đổi giá trị thành số lượng đã ký, bạn sẽ phải thực hiện một số bit-twiddling dựa trên bit thứ 16.

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

Xem thêm SO 774048SO 179565.

0

Bạn đang dịch chuyển nó theo cách nào? Vui lòng cung cấp ví dụ về mã.

thêm:

perldoc -f system 

đưa ra một rất dễ hiểu ví dụ về những gì để làm với $?

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

giá trị Exit nên được giữa 0 và 255. bạn chuyển kết hợp với cách giá trị tiêu cực đang thực sự được lưu trữ bằng máy tính nên đưa ra một số cái nhìn sâu sắc.

+0

Tôi đã dịch chuyển đúng 8 bit – syker

10

Perl trả về một mã thoát subprocess theo cách tương tự như C thư viện runtime vĩ mô WEXITSTATUS, trong đó có các mô tả sau đây trong wait(2):

 
    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. 

Phần quan trọng ở đây là đáng kể nhất tám bit. Đây là lý do tại sao bạn đang nhận được một mã lối ra của 255. Trang perlvar người đàn ông mô tả $? như sau:

 
    $?  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. 

Không có xử lý đặc biệt ở đây cho số âm trong mã thoát.

+0

Câu trả lời thú vị! – syker

Các vấn đề liên quan