Tôi có một ứng dụng máy chủ mà tôi muốn bảo vệ khỏi bị dừng lại bởi bất kỳ tín hiệu nào mà tôi có thể bỏ qua. Có cách nào để bỏ qua tất cả các tín hiệu có thể cùng một lúc, mà không cần đặt chúng từng cái một?Có thể bỏ qua tất cả các tín hiệu không?
Trả lời
Có:
#include <signal.h>
sigset_t mask;
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);
này không chính xác bỏ qua các tín hiệu, nhưng khối chúng; mà trong thực tế là tác dụng tương tự.
Tôi đoán không cần phải đề cập rằng SIGKILL
và SIGSTOP
không thể bị chặn cũng như bị bỏ qua theo bất kỳ cách nào.
Đối với ngữ nghĩa chi tiết hơn, như quy tắc thừa kế mặt nạ và những thứ tương tự, check the man page
tín hiệu Blocking là không giống như bỏ qua chúng.
Khi bạn chặn tín hiệu theo đề xuất của C2H5OH, nó sẽ được thêm vào hàng đợi tín hiệu đang chờ xử lý và sẽ được gửi đến quy trình ngay sau khi bạn bỏ chặn nó.
không chặn có thể được thực hiện bằng
#include <signal.h>
sigset_t mask;
sigemptyset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);
Để trả lời câu hỏi của bạn về làm thế nào để bỏ qua các tín hiệu, nó phải được xử lý bởi một Handler tín hiệu mà là một chức năng người dùng định nghĩa đó thực hiện bất cứ khi nào một tín hiệu được gửi đến quá trình
static void foo (int bar)
{
/*some code here. In your case, nothing*/
}
sau đó đăng ký chức năng này bằng cách sử dụng
signal(SIGINT,foo); //or whatever signal you want to ignore
Nếu bạn muốn bỏ qua tất cả các tín hiệu
int i;
for(i = 1; i <=31 ; i++)
{
signal(i,foo);
}
Mã này sẽ chuyển tất cả các tín hiệu đến quy trình và bỏ qua chúng thay vì chặn chúng.
LƯU Ý: Theo trang người đàn ông, nó không phải là cách được khuyến nghị, thay vào đó, sự thay đổi được đề xuất. Hãy xem man sigaction
Các giải pháp dựa trên sigprocmask()
và pthread_sigmask()
đã không hoạt động đối với tôi. Đây là những gì tôi tìm thấy để làm việc:
#include <signal.h>
#include <unistd.h>
#include <assert.h>
int main() {
struct sigaction act;
act.sa_handler = SIG_IGN;
for(int i = 1 ; i < 65 ; i++) {
printf("i = %d\n", i);
// 9 and 19 cannot be caught or ignored
// 32 and 33 do not exist
if((i != SIGKILL) && (i != SIGSTOP) && (i != 32) && (i != 33)) {
assert(sigaction(i, &act, NULL) == 0);
}
}
sleep(10000);
return 0;
}
- 1. Tại sao tôi không thể bỏ qua tín hiệu SIGSEGV?
- 2. Có thể lặp qua tất cả các nút với py2neo
- 3. Bỏ qua tín hiệu SIGINT trong quá trình con
- 4. Bỏ qua tất cả các tệp trong toàn cầu .gitignore
- 5. Trạng thái tín hiệu và không có tín hiệu
- 6. NUnit bỏ qua tất cả các bài kiểm tra
- 7. Git bỏ qua tất cả các file hậu tố minified
- 8. Xóa tất cả các hiệu ứng di chuột qua css
- 9. Laravel của: tất cả() bỏ qua đầu vào tàn tật
- 10. điều chỉnh tín hiệu phức tạp trên tất cả các gpio
- 11. Tín hiệu phát ra nếu tất cả các tiện ích con bị mất tiêu điểm
- 12. Làm thế nào để chặn tất cả TÍN HIỆU trong chuỗi KHÔNG sử dụng SIGWAIT?
- 13. Bỏ qua SVN bỏ qua ... có thể?
- 14. Bạn có thể duyệt qua tất cả các nút radio không?
- 15. Có thể Automapper bỏ qua các phương thức void không?
- 16. Bỏ qua tất cả dòng trống hàng đầu trong read.csv
- 17. Mercurial `hg clone` nhưng bỏ qua tất cả subrepos?
- 18. Bỏ qua tất cả các tệp có cùng tên trong git
- 19. Git bỏ qua tất cả trừ thư mục con
- 20. Làm cách nào để tạo các tệp thẻ JSP KHÔNG bỏ qua tất cả khoảng trắng?
- 21. Bỏ qua tất cả các bài kiểm tra testthat khi điều kiện không đáp ứng
- 22. gdb chấm dứt với tín hiệu ?, không rõ tín hiệu
- 23. SVN Bỏ qua tất cả các file (không phải là thư mục) trong một cây con,
- 24. Có cách nào để bảo Doxygen bỏ qua (tất cả) không gian tên?
- 25. Tạo ma trận của tất cả các kết quả có thể để ném xúc xắc (bỏ qua thứ tự)
- 26. Các tín hiệu Process.kill nào có sẵn trên Windows?
- 27. Làm thế nào để làm cho mercurial bỏ qua tất cả các tập tin ẩn?
- 28. Có thể bỏ qua các xác thực trên update_attributes không?
- 29. Làm thế nào tôi có thể bỏ qua thay đổi eol và tất cả không gian màu trắng trong svn?
- 30. gitignore - Bỏ qua tất cả các loại tệp trừ các loại được chỉ định
Vui lòng không bao giờ quên kiểm tra giá trị trả lại. Tôi bỏ qua phần đó một cách ngắn gọn. – C2H5OH
... cũng như SIGABRT hoặc SIGSEGV, tôi cho là vậy. –
@KerrekSB: Bạn thực sự có thể bắt được SIGSEGV và SIGBUS, vì vậy tôi đoán bạn cũng có thể bỏ qua chúng. Nguy cơ của riêng bạn, tất nhiên. Trang người dùng [signal (7)] (http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html) chỉ đề cập đến 'SIGSTOP' và' SIGKILL'. – C2H5OH