2012-03-01 39 views
10

Bạn có thể vui lòng cung cấp giải thích tốt về đoạn mã perl sau không. Tôi có một số ý tưởng từ google nhưng vẫn còn rất nhiều sự nhầm lẫn cơ bản là có. sự giúp đỡ tuyệt vời nếu bạn có thể cung cấp ghi chú nhỏ trên đó

$exit_value = $? >> 8; 
$signal_num = $? & 127; 
$dumped_core = $? & 128; 

Trả lời

12

Trích dẫn The Doc:

$?

Trạng thái trả về bằng lệnh đóng, đóng dấu cuối cùng (``) cuối cùng, gọi thành công để chờ() hoặc waitpid() hoặc từ toán tử system(). Đây chỉ là từ trạng thái 16 bit được trả về bởi cuộc gọi hệ thống chờ đợi() hoặc gọi là hệ thống chờ đợi() được gọi là Unix . Do đó, giá trị xuất cảnh của quy trình con thực sự là ($? >> 8) và $? & 127 cung cấp cho tín hiệu nào, nếu có, quá trình này bị chết và $? & 128 báo cáo cho dù có một kết xuất lõi.

>> 8 cho chúng ta byte cao hơn của từ 16 bit.

& 127 về cơ bản giống như & 0b01111111, đưa ra phần 7 bit thấp hơn của từ đó.

& 128 giống với & 0b10000000, cơ bản kiểm tra bit thứ 8 của kết quả.

6

Xem perldoc -f system:

if ($? == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($? & 127), ($? & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $? >> 8; 
} 

Các $? ngữ nghĩa được lấy từ cuộc gọi wait hệ thống, xem man 2 wait.

+0

Tôi sẽ tìm hiểu thêm về '$? >> 8', vì 8 bit cuối cùng này thường là giá trị đã ký: '($ exit) = giải nén (" c ", gói (" S ", ($? >> 8)))'. – Ouki

+0

@Ouki, 'gói" S "' dự kiến ​​giá trị 16 bit, nhưng tôi chân thành nghi ngờ rằng '$? >> 8' là 16 bit (vì điều đó sẽ làm cho toàn bộ số lượng 3 byte dài). Nhưng cho phép nói nó là trong một giây. Sau đó, bạn bị hỏng số bằng cách chỉ giải nén 8 trong số 16 bit. Mã đó không chính xác. – ikegami

+0

Đây không phải là, nhưng 'gói (" c ", ($? >> 8))' sẽ giúp bạn có được một cảnh báo. – Ouki

2
use POSIX qw(WEXITSTATUS WIFEXITED); 

if(WIFEXITED($?)) { 
    print "The exit status was ", WEXITSTATUS($?), "\n"; 
} 

Xem thêm WIFSIGNALEDWTERMSIG.

Một C vĩ mô hữu ích là WCOREDUMP, tài liệu trong thư viện GNU C (với sự nhấn mạnh thêm)

WCOREDUMP(status)

trả về true nếu đứa trẻ được sản xuất một bãi chứa lõi. Macro này chỉ nên được sử dụng nếu WIFSIGNALED trả về true. Macro này không được chỉ định trong POSIX.1-2001 và không có sẵn trên một số triển khai Unix (ví dụ: AIX, SunOS). Chỉ sử dụng phần đính kèm này trong & hellip; #endif.

Kể từ version 5.10.0, perl includes WCOREDUMP trong tính toán của mình về giá trị của $? nếu vĩ mô hiện có sẵn trên hệ thống của bạn, như tài liệu trong perlvar:

Do đó, giá trị xuất cảnh của tiến trình con thực sự là ($?>> 8)$? & 127 đưa ra tín hiệu nào, nếu có, quá trình này bị chết và $? & 128 báo cáo liệu có một kết xuất lõi hay không.

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