2012-11-05 35 views
8

Có thể gọi số system() có thể die trong Perl 5 không?Hệ thống Perl có thể gọi bao giờ chết không?

(nói cách khác, để 100% chống tai nạn một chương trình mà không một cuộc gọi system(), hiện nó cần phải được bao bọc thành một eval khối, hoặc là hoàn toàn hoàn toàn không cần thiết?)


Tôi chưa tìm thấy một đề cập đến khả năng đó ở số perldoc system, nhưng hoàn toàn không tìm thấy chính xác "cuộc gọi này không bao giờ chết".

LƯU Ý: câu hỏi là về CORE Perl cơ bản ở đây, không autodie hoặc bất kỳ mô-đun tùy chỉnh nào khác có tác dụng tương tự. Ngoài ra, giả sử không có tín hiệu ALRM được đặt hoặc bất kỳ trình xử lý tín hiệu tùy chỉnh nào khác cho vấn đề đó.

Tôi giả định rằng tất cả các phiên bản của Perl 5. * đều hoạt động giống nhau, nhưng nếu không, câu trả lời liên quan đến 5.8 sẽ được đánh giá cao.

+0

Tôi chưa xem và tìm nguồn, vì vậy tôi không đăng câu trả lời này, nhưng tôi sẽ ngạc nhiên nếu không có cách nào để 'hệ thống' hết bộ nhớ. – Gilles

+0

@Gilles - sẽ "Hết bộ nhớ" khiến Perl phát hành "chết" thay vì coredump/crash? Tôi sẽ giả định sau, nhưng cũng không chắc chắn – DVK

+0

@Gilles - [nếu chỉ chúng tôi có một nơi mà chúng tôi có thể đặt câu hỏi lập trình ...] (http://stackoverflow.com/questions/13243637/is-there-a-standard -way-for-perl-to-behave-khi-nó-chạy-out-of-bộ nhớ). Hãy xem những gì SO khôn ngoan phát hiện ra. – DVK

Trả lời

6

Trừ khi giải thích của tôi về nguồn là không chính xác, điều này có vẻ giống như một khả năng:

nguồn: Perl 5.16.2 (cũng đã kiểm tra 5.8.8), tệp: pp_sys.c, dòng: 4224 trong khối mã PP(pp_system):

if (n != sizeof(int)) 
    DIE(aTHX_ "panic: kid popen errno read, n=%u", n); 

DIE được Perl_die(pTHX_ const* pat, ...) khai báo trong util.c

Theo tài liệu, "hoảng loạn: đứa trẻ popen errno đọc" có nghĩa là "đứa trẻ chia hai trả lại một thông điệp không thể hiểu được về errno của nó".

Explanation of panic messages in Perl:

Quy ước là khi người phiên dịch chết với một lỗi nội bộ, thông điệp bắt đầu "hoảng loạn:".Trong lịch sử, nhiều thông điệp hoảng loạn đã là các chuỗi cố định, có nghĩa là các giá trị ngoài phạm vi đã kích hoạt sự hoảng sợ bị mất. Bây giờ chúng tôi cố gắng báo cáo các giá trị này, vì các sự cố như vậy có thể không lặp lại được và thông báo lỗi ban đầu có thể là chẩn đoán duy nhất chúng tôi nhận được khi chúng tôi tìm nguyên nhân.

+0

từ đọc của tôi về nguồn này sẽ chỉ xảy ra nếu 1) exec() được thực hiện bởi đứa trẻ thất bại và 2) đứa trẻ không thể gửi 4 (có thể 8) byte trở lại phụ huynh qua đường ống. – ErikR

0

system trả về trạng thái thoát của chương trình. Nó có nghĩa là, nếu chương trình bị treo, kịch bản lệnh Perl gọi tiếp tục (xem system).

Tuy nhiên, bản thân chương trình vẫn có thể giết tập lệnh gọi hoặc thậm chí làm hỏng máy tính. Ví dụ: trong Linux:

system 'killall', 'perl'; 
print "Alive\n"; 
+0

Vui lòng xem nhận xét của tôi về Brian Agnew. Đây không phải là những gì tôi đã hỏi về. – DVK

1

Bạn có thể gọi system() với kỳ vọng rằng nó sẽ không ném ngoại lệ. Không cần bọc nó trong khối eval.

+0

"với kỳ vọng" - có cơ sở kỹ thuật cho điều này không? Nếu bạn nhìn vào câu trả lời của j.w.r., câu nói của bạn có vẻ hoàn toàn sai. – DVK

+0

Tôi sẽ quan tâm đến việc xem có bao nhiêu mô-đun CPAN cố gắng bắt một ngoại lệ được ném bởi 'hệ thống'. Điểm không phải là nó không thể xảy ra mà đúng hơn là bạn thường có thể sử dụng 'system()' với kỳ vọng rằng nó sẽ không ném một ngoại lệ. – ErikR

0

Tôi giả sử rằng bạn đang nói về việc thực hiện chính hàm system trái ngược với bất kỳ điều gì được gọi thông qua cuộc gọi. (Rõ ràng, một quá trình con không thể gọi die trong bối cảnh của cha mẹ, và thậm chí giả định rằng cuộc gọi là mã Perl.)

Một câu trả lời dứt khoát sẽ yêu cầu kiến ​​thức về nội bộ nhưng cho rằng cố gắng gọi một không chương trình -existent không chết, tôi không thể tưởng tượng rằng bất cứ điều gì khác bao giờ sẽ, một trong hai:

system('abcd');  # 'abcd' is not recognized... [Win32 message] 
say "I'm not dead."; # always prints 
+0

"Tôi cho rằng bạn đang nói về việc thực hiện các chức năng hệ thống chính nó như trái ngược với bất cứ điều gì được gọi thông qua cuộc gọi." - chính xác – DVK

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