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?
Trả lời
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;
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.
Tôi đã dịch chuyển đúng 8 bit – syker
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.
Câu trả lời thú vị! – syker
- 1. Tại sao Perl thay chuỗi của tôi bằng "1"?
- 2. Tại sao frame-> pts tăng 20, thay vì 1?
- 3. Lỗi SSIS Weird (Quy trình Thoát Mã 255)
- 4. Tại sao lưu thoát bát phân Java chỉ lên tới 255?
- 5. Tại sao tập lệnh Perl của tôi thoát với 137?
- 6. prebuild sự kiện Sao chép lệnh thoát với mã 1
- 7. Trong mục tiêu-C, tại sao điều này tăng thêm 4 thay vì 1?
- 8. Perl: Tại sao không đánh giá '/(...)/' đặt $ 1?
- 9. Tại sao tôi nên sử dụng Cá chép thay vì cảnh báo trong Perl?
- 10. Tại sao CHỌN 0, ... thay vì CHỌN
- 11. JVM đã chấm dứt. Mã thoát = -1
- 12. Tại sao chặn thay vì lặp?
- 13. Tại sao FloatBuffer thay vì phao []?
- 14. Tại sao foreach tăng số lần truy cập bằng 2 thay vì 1?
- 15. Tại sao strtotime (ngày 1 tháng 1 năm 1970) trả về -3600 thay vì 0 trong PHP?
- 16. Tại sao darcs thay vì git?
- 17. Tại sao lớp Python của tôi cho rằng tôi có 2 đối số thay vì 1?
- 18. Tại sao sử dụng sys.path.append (đường dẫn) thay vì sys.path.insert (1, đường dẫn)?
- 19. Tại sao mọi người sử dụng i = i + 1 thay vì i + +?
- 20. Tại sao NDEBUG thay vì RELEASE?
- 21. Tại sao testFixture thay vì TestClass?
- 22. Tại sao nhập javax.swing. * Thay vì java.swing. *
- 23. Tại sao `this.synchronized` thay vì chỉ` đồng bộ` trong Scala?
- 24. Tại sao ghci cho tôi một loại cho "1 ++ 2" thay vì ragequitting?
- 25. Tại sao Objective-C sử dụng YES và NO thay vì 1 và 0?
- 26. Nhận Perl để trả lại mã thoát chính xác
- 27. Tại sao sử dụng tăng :: ice_or thay vì || và tăng :: ice_and thay vì && trong enable_if?
- 28. Tại sao Locale.getDefault(). GetLanguage() trong Android trả về tên hiển thị thay vì mã ngôn ngữ?
- 29. (-1 >> 1) == -1 - Tại sao?
- 30. tại sao nó sử dụng movl thay vì đẩy?
Có lẽ bạn có thể giải thích lý do tại sao bạn mong đợi mã thoát là -1. –
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
'perl -e" exit -1 "; echo $? '=> 255. – jrockway