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.

Để 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.

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

Danh sách System Call phổ biến
Quản lý tiến trình
| Hàm | Mô 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ên | unistd.h |
| fork() | Tạo bản sao tiến trình | unistd.h |
| getpid() | Lấy PID tiến trình hiện tại | unistd.h |
| getppid() | Lấy PID tiến trình cha | unistd.h |
| exit() | Kết thúc tiến trình với mã trạng thái | stdlib.h |
| getcwd(), getwd() | Lấy thư mục làm việc hiện tại | unistd.h |
| pause() | Tạm dừng tiến trình cho đến khi có tín hiệu | unistd.h |
| wait() | Cha chờ tiến trình con kết thúc | wait.h |
Quản lý tệp
| Hàm | Mô tả | Header |
|---|---|---|
| open(), openat() | Mở tệp | fcntl.h |
| close() | Đóng tệp | unistd.h |
| read() | Đọc tệp | unistd.h |
| poll() | Kiểm tra sẵn sàng I/O | poll.h |
| write() | Ghi tệp | unistd.h |
| fcntl() | Thao tác descriptor | fcntl.h |
| truncate(), ftruncate() | Cắt tệp đến độ dài chỉ định | unistd.h |
| creat() | Tạo tệp | fcntl.h |
| chmod(), fchmod() | Thay đổi quyền tệp | sys/stat.h |
| unlink() | Xóa tệp | unistd.h |
Xử lý tín hiệu (Signal)
| Hàm | Mô tả | Header |
|---|---|---|
| signal() | Gán handler cho tín hiệu | signal.h |
| kill() | Gửi tín hiệu đến tiến trình | signal.h |
| killpg() | Gửi tín hiệu đến nhóm tiến trình | signal.h |
| raise() | Kích hoạt tín hiệu trong tiến trình gọi | signal.h |
| sigaction() | Thiết lập hành động tín hiệu | signal.h |
| sigwait() | Chờ tín hiệu cụ thể | signal.h |
| sighold() | Thêm tín hiệu vào mask | signal.h |
| sigignore() | Bỏ qua tín hiệu | signal.h |
| sigblock() | Chặn tín hiệu | signal.h |
| psignal(), psiginfo() | In mô tả tín hiệu | signal.h |
Xử lý Socket
| Hàm | Mô tả | Header |
|---|---|---|
| socket() | Tạo socket | socket.h |
| bind() | Gán địa chỉ cho socket | socket.h |
| connect() | Kết nối socket | socket.h |
| listen() | Lắng nghe kết nối | socket.h |
| accept() | Chấp nhận kết nối | socket.h |
| recv(), recvfrom(), recvmsg() | Nhận tin nhắn | socket.h |
| send(), sendto(), sendmsg() | Gửi tin nhắn | socket.h |
| getsockname() | Lấy địa chỉ socket theo descriptor | socket.h |
| getsockopt() | Lấy/thiết lập tùy chọn socket | socket.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.