2016-09-01 24 views
6

Tôi nghĩ rằng tôi có thể đã làm điều này sai trong một thời gian, bởi vì chúng tôi chỉ chuyển sang systemd và nó xem xét quá trình giết chết của tôi đã kết thúc không thành công.Mã thoát của chương trình của tôi là gì nếu tôi nhận được tín hiệu?

Về cơ bản tôi lắng nghe SIGHUP, SIGINTSIGTERM và sau đó (bằng cách chuyển mã tín hiệu trở lại lên main) sạch sẽ, ví dụ: return 128+SIGHUP.

tôi mong đợi này sẽ được sử dụng để cư $?, nhưng bây giờ tôi nghĩ tôi hiểu rằng vỏ có trách nhiệm đưa ra $? một giá trị như vậy, và sau đó chỉ nếu tín hiệu là unhandled. Vì vậy, ngay cả khi quá trình thoát cuối cùng do tín hiệu, vì tín hiệu đã được xử lý, $? sẽ kết thúc là 0 và tất cả bằng chứng cho thấy tín hiệu có liên quan đến việc thoát sẽ bị mất. Có đúng không?

Khi xử lý SIGHUP và thoát ra sạch, tôi có nên return EXIT_SUCCESS từ main?

+0

Tôi đoán nó phụ thuộc. Nếu chấm dứt bằng tín hiệu được coi là chạy thành công nhị phân thì có. Nếu những tín hiệu đó biểu thị lỗi thì EXIT_FAILURE. – Hayt

+0

@Hayt: Vì vậy, takeaway là tôi không nên làm _anything_ để kết hợp các mã tín hiệu vào quá trình xuất cảnh mã một trong hai cách? –

+0

Đang bị chấm dứt hoặc treo lên một dấu hiệu cho thấy chương trình của bạn đã thất bại trong nhiệm vụ của mình? – StoryTeller

Trả lời

5

Quy ước trở về 128 + <signal number> được thúc đẩy bởi Advanced Bash Scripting Guide số những người khác (https://stackoverflow.com/a/1535733/567292), nhưng chỉ dành cho trường hợp khi chương trình của bạn không như là kết quả nhận được tín hiệu.

Nếu chương trình của bạn nhận được tín hiệu, không không xử lý nó, và chấm dứt như vậy, trạng thái thoát (theo quy định ví dụ bằng cách wait) sẽ tương tự nhưng thay vì bit 7 bộ sẽ có một bộ bit cao hơn để chỉ ra WIFSIGNALED như trái ngược với WIFEXITED. Nếu bạn đang chạy trong một trình bao, thì đây là translated by the shell để cung cấp trạng thái thoát ($?) trong phạm vi 128-255 (ví dụ, với bộ 7 bit), do đó, theo kịch bản lệnh shell, chương trình trả lại 128+n là không thể phân biệt được bởi một chương trình chấm dứt vì một tín hiệu không được xử lý:

[...] Khi báo cáo trạng thái thoát với tham số đặc biệt '?', vỏ phải báo cáo đầy đủ tám bit trạng thái thoát. Các trạng thái thoát của một lệnh chấm dứt vì nó nhận được một tín hiệu sẽ được báo cáo là lớn hơn 128.

Nếu chương trình của bạn nhận được một tín hiệu sau đó thành công thoát, điều này được coi là một kết thúc thành công, vì vậy chương trình của bạn nên trả lại EXIT_SUCCESS.

+1

Hoàn hảo, cảm ơn :) Đây là một "lỗi" trong khung sự kiện của tôi trong khoảng sáu năm. Rất tiếc ... –

2

Mã trả lại thường là những gì bạn chỉ định chúng. Khi bạn muốn bao gồm tín hiệu để thoát mã, bạn phải chắc chắn rằng chúng vẫn duy trì.

Nếu bạn không cần tín hiệu trong mã thoát, có vẻ như không có lý do gì để đưa chúng vào.

Có trả lại EXIT_SUCCESS hoặc EXIT_FAILURE tùy thuộc vào bạn/chương trình của bạn cho dù chấm dứt được tính là thành công hay thất bại.

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