Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Hiểu về System Call: Mục đích, Chức năng và Cách dùng phổ biến trên Linux

Bài viết Linuxhint này giải thích khái niệm system call (syscall), mục đích sử dụng, sự khác biệt so với hàm thư viện C chuẩn. Cũng trình bày vai trò của kernel, cách tiến trình yêu cầu dịch vụ, danh sách các syscall phổ biến kèm header khai báo, và cách giám sát syscall bằng lệnh strace.

Mô hình lớp và vai trò Kernel

Hệ thống gồm nhiều lớp: phần cứng (lowest), kernel (trái tim OS, quản lý phần cứng, bộ nhớ, tiến trình, ổ cứng, mạng), và user mode (lớp trên cùng, nơi ứng dụng chạy). User mode bị hạn chế truy cập tài nguyên trực tiếp. Kernel là cầu nối duy nhất giữa phần mềm và phần cứng.

Do đó, cần cơ chế cho phép tiến trình user mode yêu cầu kernel cung cấp dịch vụ dùng tài nguyên hệ thống. Đó chính là system call.

System Call là gì?

System call là tập hàm do OS cung cấp, đóng vai trò giao diện giữa tiến trình user và kernel. Chúng cho phép yêu cầu dịch vụ cần tài nguyên hệ thống. Syscall không cấp quyền truy cập trực tiếp, kernel quản lý và cung cấp dưới sự kiểm soát chặt chẽ.

Về mặt lập trình, syscall trông như hàm bình thường: có tham số đầu vào, giá trị trả về, kiểu dữ liệu chuẩn C (thường là con trỏ, descriptor, đường dẫn...). Cách gọi cũng giống hàm thư viện. Việc phân biệt syscall hay hàm thư viện chỉ mang tính chất khái niệm.

Linux hiện có khoảng 350 system call. Nhiều hàm thư viện (như malloc, free, calloc, realloc) thực chất quản lý bộ nhớ động thông qua syscall bên dưới.

Giám sát System Call với strace

Lệnh strace cho phép theo dõi syscall real-time từ dòng lệnh. Chạy strace -h để xem các tùy chọn.

Hiểu về System Call: Mục đích, Chức năng và Cách dùng phổ biến trên Linux

Để giám sát syscall của một tiến trình: strace ./ten_tien_trinh.

Ví dụ: biên dịch chương trình socket kết nối Google (từ bài "Connect Function in C language"), chạy với strace ./connect. Kết quả hiển thị các syscall như socket, connect, send, recv và nhiều syscall khác do thư viện thực hiện.

Hiểu về System Call: Mục đích, Chức năng và Cách dùng phổ biến trên Linux

Lệnh strace -c ./ten_tien_trinh hiển thị tóm tắt syscall khi tiến trình kết thúc.

Hiểu về System Call: Mục đích, Chức năng và Cách dùng phổ biến trên Linux

Danh sách System Call phổ biến

Quản lý tiến trình

HàmMô tảHeader
execl(), execlp(), execle(), execv(), execvp(), execvpe()Họ hàm thay thế tiến trình, kế thừa PID và tài nguyênunistd.h
fork()Tạo bản sao tiến trìnhunistd.h
getpid()Lấy PID tiến trình hiện tạiunistd.h
getppid()Lấy PID tiến trình chaunistd.h
exit()Kết thúc tiến trình với mã trạng tháistdlib.h
getcwd(), getwd()Lấy thư mục làm việc hiện tạiunistd.h
pause()Tạm dừng tiến trình cho đến khi có tín hiệuunistd.h
wait()Cha chờ tiến trình con kết thúcwait.h

Quản lý tệp

HàmMô tảHeader
open(), openat()Mở tệpfcntl.h
close()Đóng tệpunistd.h
read()Đọc tệpunistd.h
poll()Kiểm tra sẵn sàng I/Opoll.h
write()Ghi tệpunistd.h
fcntl()Thao tác descriptorfcntl.h
truncate(), ftruncate()Cắt tệp đến độ dài chỉ địnhunistd.h
creat()Tạo tệpfcntl.h
chmod(), fchmod()Thay đổi quyền tệpsys/stat.h
unlink()Xóa tệpunistd.h

Xử lý tín hiệu (Signal)

HàmMô tảHeader
signal()Gán handler cho tín hiệusignal.h
kill()Gửi tín hiệu đến tiến trìnhsignal.h
killpg()Gửi tín hiệu đến nhóm tiến trìnhsignal.h
raise()Kích hoạt tín hiệu trong tiến trình gọisignal.h
sigaction()Thiết lập hành động tín hiệusignal.h
sigwait()Chờ tín hiệu cụ thểsignal.h
sighold()Thêm tín hiệu vào masksignal.h
sigignore()Bỏ qua tín hiệusignal.h
sigblock()Chặn tín hiệusignal.h
psignal(), psiginfo()In mô tả tín hiệusignal.h

Xử lý Socket

HàmMô tảHeader
socket()Tạo socketsocket.h
bind()Gán địa chỉ cho socketsocket.h
connect()Kết nối socketsocket.h
listen()Lắng nghe kết nốisocket.h
accept()Chấp nhận kết nốisocket.h
recv(), recvfrom(), recvmsg()Nhận tin nhắnsocket.h
send(), sendto(), sendmsg()Gửi tin nhắnsocket.h
getsockname()Lấy địa chỉ socket theo descriptorsocket.h
getsockopt()Lấy/thiết lập tùy chọn socketsocket.h

Kết luận

Bài viết đã giải thích system call, cách tiến trình user tương tác kernel qua syscall, liệt kê các syscall phổ biến theo nhóm kèm header, và hướng dẫn dùng strace giám sát syscall real-time.