Tôi sẽ sử dụng exit() như trong ví dụ của bạn mặc dù điều này áp dụng cho tất cả các cuộc gọi hệ thống.
Các chức năng của biểu mẫu sys_exit() là các điểm vào thực tế đối với thường trình hạt nhân thực hiện hàm mà bạn nghĩ là exit(). Những biểu tượng này thậm chí không có sẵn cho người lập trình chế độ người dùng. Đó là, trừ khi bạn đang hack hạt nhân, bạn không thể liên kết đến các chức năng này bởi vì các biểu tượng của chúng không có sẵn bên ngoài hạt nhân. Nếu tôi đã viết libmsw.a có chức năng phạm vi tệp như
static int msw_func() {}
được xác định trong đó, bạn sẽ không thành công khi cố gắng liên kết với nó vì nó không được xuất trong bảng biểu tượng libmsw; đó là:
cc your_program.c libmsw.a
sẽ mang lại một lỗi như:
ld: cannot resolve symbol msw_func
bởi vì nó không được xuất khẩu; cùng áp dụng cho sys_exit() như được chứa trong hạt nhân.
Để chương trình người dùng truy cập vào các thói quen hạt nhân, giao diện syscall (2) cần được sử dụng để thực hiện chuyển đổi từ chế độ người dùng sang chế độ hạt nhân. Khi chế độ đó chuyển đổi (somtimes gọi là một cái bẫy) xảy ra một số nguyên nhỏ được sử dụng để tìm kiếm các thói quen hạt nhân thích hợp trong một bảng hạt nhân bản đồ số nguyên để chức năng hạt nhân. Một mục trong bảng có dạng
{SYS_exit, sys_exit},
đâu SYS_exit là một vĩ mô Preprocessor đó là
#define SYS_exit (1)
và đã được 1 kể từ trước khi bạn được sinh ra vì chưa có lý do gì để thay đổi nó. Nó cũng xảy ra là mục nhập đầu tiên trong bảng các cuộc gọi hệ thống mà làm cho tìm kiếm một chỉ mục mảng đơn giản.
Khi bạn lưu ý trong câu hỏi của mình, cách thích hợp để chương trình chế độ người dùng thông thường truy cập sys_exit là thông qua trình bao bọc mỏng trong glibc (hoặc thư viện lõi tương tự). Lý do duy nhất bạn cần làm với SYS_exit hoặc sys_exit là nếu bạn đang viết mã hạt nhân.
glibc không cung cấp trình bao bọc cho mọi cuộc gọi hệ thống, vì vậy trong một số trường hợp, bạn có thể cần macro tiền xử lý 'SYS_' tương ứng để gọi trực tiếp hệ thống thông qua' syscall() 'trong mã vùng người dùng. Những trường hợp này là rất hiếm. –