Giải thích về việc tạo và xử lý tín hiệu Linux
Cơ chế báo hiệu trong nhân Linux cho phép các ứng dụng đang chạy thông báo không đồng bộ cho hệ thống khi một sự kiện mới xảy ra. Vì bản chất của nó, cơ chế báo hiệu này thường được gọi là ngắt phần mềm. Cũng giống như ngắt phần cứng, các tín hiệu làm gián đoạn luồng thông thường của ứng dụng và không thể đoán trước được khi nào một ứng dụng sẽ nhận được tín hiệu.
Hãy đi sâu vào cơ chế tín hiệu trong Linux và hiểu những gì diễn ra đằng sau hậu trường.
Mục Lục
Các khái niệm tín hiệu cơ bản trong Linux
Trên Linux, các quy trình tạo ra tín hiệu trong ba trường hợp cơ bản:
- Khi một tình huống ngoại lệ xảy ra ở phía phần cứng. Ví dụ: bạn có thể nghĩ đến các sự kiện chẳng hạn như ứng dụng đang cố gắng truy cập vào một vùng bên ngoài không gian địa chỉ cho phép (lỗi phân đoạn) hoặc tạo mã máy bao gồm phép toán chia cho không.
- Các tình huống như việc sử dụng các tổ hợp phím như Ctrl + C hoặc Ctrl + Z trên bảng điều khiển của người dùng, thay đổi kích thước màn hình bảng điều khiển hoặc gửi tín hiệu kết thúc.
- Bộ hẹn giờ trong ứng dụng hết hạn, giới hạn CPU được cung cấp cho ứng dụng cao, dữ liệu đến bộ mô tả tệp đang mở, v.v.
Khái niệm tín hiệu đã có từ những phiên bản đầu tiên của Unix. Trước đây, có một số khác biệt giữa các phiên bản Unix liên quan đến việc xử lý tín hiệu. Sau đó, với tiêu chuẩn hóa POSIX được thực hiện để quản lý tín hiệu, Linux và các dẫn xuất Unix khác bắt đầu tuân theo các tiêu chuẩn này. Vì lý do này, các khái niệm về tín hiệu Unix và tín hiệu POSIX, mà bạn có thể gặp trong một số tài liệu, chỉ ra sự khác biệt.
Số tín hiệu
Các tín hiệu có nhiều giá trị số khác nhau, bắt đầu bằng một. Ví dụ, tín hiệu 1 là HÚT tín hiệu trong hầu hết mọi hệ thống, hoặc tín hiệu 9 là GIẾT dấu hiệu.
Tuy nhiên, việc sử dụng những con số này không được khuyến khích khi bạn sử dụng tín hiệu trong các ứng dụng của mình. Đối với tín hiệu POSIX, signal.h tệp phải có trong ứng dụng và nhà phát triển nên sử dụng các định nghĩa không đổi của các số liên quan, chẳng hạn như ĐĂNG KÍ, SIGKILLv.v. thay vào đó.
Nếu bạn kiểm tra /usr/include/signal.h trên hệ thống của bạn, bạn có thể xem các hoạt động bổ sung và các tệp được bao gồm khác bằng cách xem định nghĩa của các giá trị như __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, v.v. trong tệp. Bạn có thể tìm thấy các số tín hiệu có sẵn trên các hệ thống Linux trong /usr/include/asm-generic/signal.h mà bạn không cần phải đưa trực tiếp vào mã ứng dụng của mình.
Tạo và gửi tín hiệu
Sự tạo tín hiệu xảy ra do một sự kiện. Tuy nhiên, việc gửi (phân phối) tín hiệu đến ứng dụng liên quan không xảy ra đồng thời với việc tạo ra tín hiệu.
Để tín hiệu được gửi đến ứng dụng, ứng dụng phải hiện đang chạy và có tài nguyên CPU. Do đó, việc gửi tín hiệu đến một ứng dụng cụ thể xảy ra khi ứng dụng có liên quan bắt đầu hoạt động trở lại sau khi chuyển đổi ngữ cảnh.
Khái niệm tín hiệu đang chờ xử lý
Trong suốt thời gian từ khi phát đến khi truyền tín hiệu, các tín hiệu đều ở trạng thái chờ. Bạn có thể truy cập số lượng tín hiệu đang chờ xử lý và số lượng tín hiệu đang chờ xử lý được phép cho một quá trình từ / proc / PID / status tập tin.
cat /proc/2299/status
...
SigQ: 2/31630
...
Mặt nạ và chặn tín hiệu
Ứng dụng thường không đoán trước được thời gian chính xác mà các tín hiệu sẽ đến. Do đó, một số gián đoạn quan trọng có thể xảy ra trong bất kỳ hoạt động nào. Điều này có thể gây ra sự cố lớn cho một ứng dụng quy mô lớn.
Để phòng tránh một số trường hợp không mong muốn như thế này, việc sử dụng mặt nạ tín hiệu là vô cùng cần thiết. Do đó có thể chặn một số tín hiệu trước một hoạt động quan trọng. Ở giai đoạn này, điều quan trọng là phải hoàn thành phần quan trọng và loại bỏ các khối đã xác định. Quá trình này là điều mà nhà phát triển ứng dụng cần chú ý.
Khi ứng dụng chặn một tín hiệu, các tín hiệu khác cùng loại được tạo ra sẽ ở trạng thái chờ cho đến khi được bỏ chặn. Trong ứng dụng, việc gửi các tín hiệu đang chờ xử lý cũng được cung cấp ngay sau khi khối được gỡ bỏ.
Bằng cách này, các loại tín hiệu tương tự được giữ lại tại thời điểm khối chỉ được gửi đến ứng dụng một lần sau khi khối được gỡ bỏ trong sử dụng bình thường. Tình hình khác nhau đối với tín hiệu thời gian thực.
Các loại tín hiệu Linux
Các hành động mặc định có thể khác nhau tùy theo loại tín hiệu. Nếu ứng dụng nhận được tín hiệu tương ứng không có chức năng xử lý tín hiệu, thì hành động mặc định sẽ diễn ra. Đôi khi điều này có nghĩa là kết thúc ứng dụng và đôi khi bỏ qua tín hiệu.
Một số tín hiệu không thể được bắt ở lớp ứng dụng, những tín hiệu này luôn thực hiện hành động mặc định (như tín hiệu KILL).
Ngoài một số hành động khiến ứng dụng kết thúc, tệp kết xuất lõi cũng được tạo ra. Tệp kết xuất lõi, được tạo bằng cách ghi bảng bộ nhớ ảo của quy trình liên quan vào đĩa, giúp người dùng kiểm tra thông tin trạng thái trước khi quy trình kết thúc bằng các công cụ gỡ lỗi trong giai đoạn tiếp theo.
Các giá trị sau dựa trên kiến trúc MIPS mẫu:
| Dấu hiệu | Con số | Hành động mặc định | Nó có thể bị bắt? |
|---|---|---|---|
| ĐĂNG KÍ | 1 | Chấm dứt ứng dụng | Đúng |
| SIGINT | 2 | Chấm dứt ứng dụng | Đúng |
| SIGQUIT | 3 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGILL | 4 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGTRAP | 5 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGABRT | 6 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGFPE | số 8 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGKILL | 9 | Chấm dứt ứng dụng | Không |
| SIGBUS | 10 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGSEGV | 11 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGSYS | 12 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGPIPE | 13 | Chấm dứt ứng dụng | Đúng |
| SIGALRM | 14 | Chấm dứt ứng dụng | Đúng |
| SIGTERM | 15 | Chấm dứt ứng dụng | Đúng |
| SIGUSR1 | 16 | Chấm dứt ứng dụng | Đúng |
| SIGUSR2 | 17 | Chấm dứt ứng dụng | Đúng |
| SIGCHLD | 18 | Làm lơ | Đúng |
| SIGTSTP | 20 | Ngừng lại | Đúng |
| SIGURG | 21 | Phớt lờ | Đúng |
| SIGPOLL | 22 | Chấm dứt ứng dụng | Đúng |
| SIGSTOP | 23 | Ngừng lại | Không |
| SIGCONT | 25 | Tiếp tục nếu dừng lại | Đúng |
| SIGTTIN | 26 | Ngừng lại | Đúng |
| SIGTTOU | 27 | Dừng lại | Đúng |
| SIGVTALRM | 28 | Chấm dứt ứng dụng | Đúng |
| SIGPROF | 29 | Chấm dứt ứng dụng | Đúng |
| SIGXCPU | 30 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
| SIGXFSZ | 31 | Chấm dứt ứng dụng (kết xuất lõi) | Đúng |
Vòng đời của tín hiệu trong Linux
Tín hiệu trải qua ba giai đoạn. Chúng được tạo ra chủ yếu trong giai đoạn sản xuất, bởi nhân hoặc bất kỳ quá trình nào và được biểu thị bằng một con số. Chúng hoạt động nhẹ nhàng và nhanh chóng, vì chúng không có thêm bất kỳ tải trọng nào trên chúng. Nhưng nếu bạn nhìn vào phía POSIX, bạn sẽ thấy rằng các tín hiệu thời gian thực có thể truyền thêm dữ liệu.
Giai đoạn phân phối tín hiệu đến sau giai đoạn sản xuất. Thông thường, các tín hiệu đến ứng dụng từ hạt nhân càng nhanh càng tốt. Tuy nhiên, đôi khi các ứng dụng có thể chặn tín hiệu trong khi thực hiện các hoạt động quan trọng. Trong những trường hợp như vậy, tín hiệu vẫn đang chờ xử lý cho đến khi giao dịch diễn ra.
Giống như các tín hiệu, các quy trình cũng là một phần không thể thiếu của hệ sinh thái Linux. Hiểu các quy trình là gì và cách chúng hoạt động là rất quan trọng nếu bạn dự định trở thành quản trị viên hệ thống Linux.
Đọc tiếp