01-general-knowledge:
Bài 1 + Bài 2: Tạo static lib và shared lib sử dụng Makefile
02-linux-file-system:
Bài 3: Tạo file test.txt và ghi một đoạn dữ liệu bất kì. Thực hiện ghi ra màn hình các thông tin: Loại file, tên file, thời gian chỉnh sửa file lần cuối, kích thước. (Sử dụng struct stat)
Bài 4: Viết một chương trình mở một file bất kì và sử dụng cờ O_APPEND, sau đó thực hiện seek về đầu file rồi ghi một vài dữ liệu vào file đó. Dữ liệu sẽ xuất hiện ở vị trí nào của file và tại sao lại như vậy?
03-process:
Bài 5: Viết một chương trình A tạo ra một tiến trình con B rồi in ra PID và PPID của chúng.
Bài 6: Viết một chương trình A tạo ra một tiến trình con B, in ra PID và PPID của chúng. Sử dụng system waitpid() để lấy được trạng thái kết thúc của tiến con B.
Bài 7: Từ kiến thức đã học, sử dụng SIGCHLD để ngăn ngừa việc hình thành zombie process.
04-thread:
Bài 10: Cung một ví dụ mà multi-thread không cung cấp hiệu suất tốt hơn các giải pháp single-thread
Bài 11: Viết một chương trình thực hiện tạo 2 threads. Cả hai threads này đều dùng chung một handler.
- Kiểm tra nếu là thread1 đang thực hiện thì in ra thông điệp bất kì để xác định.
- Nếu là thread2 thì truyền vào dữ liệu kiểu struct human được khởi tạo từ trước, với các thông tin: Họ tên, năm sinh, sdt, quê quán. Sau đó in các thông tin này ra màn hình.
Bài 12: Viết một chương trình thực hiện tạo 3 threads.
Thread 1: Thực hiện việc nhập dữ liệu sinh viên từ bàn phím, bao gồm thông tin: Họ tên, ngày sinh, quê quán.
Thread2: Mỗi lần nhập xong dữ liệu một sinh viên, thread này sẽ ghi thông tin sinh viên đó vào file (mỗi thông tin sinh viên nằm trên 1 dòng) thongtinsinhvien.txt.
Thread3: Đọc dữ liệu vừa ghi được và in ra màn hình sau đó thông báo cho thread 1 tiếp tục nhập thêm sinh viên.
Sử dụng mutex và condition variable để giải quyết bài toán.
05-signal:
Bài 8: Viết chương trình in ra thông điệp bất kì khi nhấn tổ hợp phím Ctrl+C. Đăng ký action cho SIGUSR1 và SIGUSR2.
Bài 9: Kiểm tra SIGINT có bị block trong process hay không. Nếu không thực hiện block/ublock thử SIGINT.
06-socket
Bài 13: Viết chương trình client giao tiếp với server thông qua socket sử dụng ipv4 stream socket.
07-pipes-FIFOs
Bài 14: Tạo Pipe, trao đổi dữ liệu giữa các related process.
Bài 15: Tạo FIFO, trao đổi dữ liệu giữa các unrelated process.
08-shared_memory
Bài 16: So sánh giữa hai phương thức mapping memory sử dụng hàm mmap() (POSIX api). Triển khai code để chứng minh.
09-message_queue
Bài 17: Tạo ra một danh sách sinh viên mới message queues. Định dạng dữ liệu lưu trữ trong queues như sau:
struct message {
long priority <id của sinh viên>;
struct sinhvien {
char hoten[50];
int tuoi;
char quequan[100];
char sdt[100];
};
}
- Menu hiển thị chức năng.
- Nhập thông tin sinh viên từ bàn phím và lưu trữ vào trong queue.
- Hiển thị thông tin sinh viên thông qua id.
- Hiển thị toàn bộ danh sách của sinh viên.
- Xóa một sinh viên khỏi danh sách thông qua id.
Lưu ý: giá trị id của mỗi sinh viên là duy nhất và lớn hơn 0.