Bài 43.324 phút đọc
Named pipe và các cơ chế IPC
Sau bài này bạn sẽ làm được
- Tạo và dùng named pipe bằng mkfifo
- Phân biệt pipe với FIFO
- So sánh sáu cơ chế IPC trên đặc điểm
- Chọn cơ chế IPC phù hợp cho một tình huống
Pipe chỉ nối được các tiến trình họ hàng. Named pipe (FIFO) bỏ ràng buộc đó: một tệp đặc biệt trên hệ tệp mà hai tiến trình bất kỳ mở để nói chuyện. Bài này cũng so sánh sáu cơ chế IPC để bạn chọn đúng.
#Named pipe (FIFO)
Named pipe (FIFO)
Một pipe có tên trên hệ tệp. Bạn tạo nó bằng
mkfifo, và nó xuất hiện như một tệp đặc biệt. Hai tiến trình bất kỳ mở tệp đó, một bên ghi, một bên đọc, và truyền dữ liệu qua nó như pipe thường. FIFO là viết tắt của first in first out.terminal
# Tao mot FIFO
mkfifo /tmp/myfifo && ls -l /tmp/myfifo
prw-r--r-- 1 an an 0 /tmp/myfifo
# Cua so 1: ghi vao FIFO (chan cho toi khi co ben doc)
echo 'xin chao' > /tmp/myfifo
# Cua so 2: doc tu FIFO
cat < /tmp/myfifo
xin chao
#Dùng FIFO trong C
Bên ghi và bên đọc
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
/* Tao FIFO (chi can mot ben tao) */
mkfifo("/tmp/myfifo", 0666);
/* --- Ben GHI (tien trinh A) --- */
int fd = open("/tmp/myfifo", O_WRONLY); /* CHAN cho toi khi co ben doc */
write(fd, "hello", 5);
close(fd);
/* --- Ben DOC (tien trinh B, co the la chuong trinh khac) --- */
int fd = open("/tmp/myfifo", O_RDONLY); /* CHAN cho toi khi co ben ghi */
char buf[100];
ssize_t n = read(fd, buf, sizeof buf);
close(fd);
unlink("/tmp/myfifo"); /* xoa FIFO khi xong */#Pipe so với FIFO
| Pipe | FIFO (named pipe) | |
|---|---|---|
| Tạo bằng | pipe() | mkfifo() |
| Có tên trên hệ tệp | Không | Có |
| Giữa tiến trình nào | Chỉ họ hàng (cha con, anh em) | Bất kỳ |
| Chiều | Một chiều | Một chiều |
| Tồn tại khi nào | Trong khi tiến trình sống | Tới khi unlink |
| Dùng cho | cmd1 | cmd2 trong shell | Hai chương trình rời nói chuyện |
#Sáu cơ chế IPC
| Cơ chế | Đặc điểm | Dùng khi |
|---|---|---|
| Pipe | Một chiều, cha con, đơn giản | Nối lệnh, giao tiếp cha con nhanh |
| FIFO | Một chiều, tiến trình bất kỳ | Hai chương trình rời trên cùng máy |
| Socket Unix | Hai chiều, nhanh, linh hoạt | Giao tiếp hai chiều phức tạp, phổ biến nhất |
| Bộ nhớ chia sẻ | Nhanh nhất, không sao chép | Truyền dữ liệu lớn, cần đồng bộ thủ công |
| Hàng đợi thông điệp | Có cấu trúc, có ưu tiên | Thông điệp rời rạc có độ ưu tiên |
| Tín hiệu | Thông báo đơn giản, không mang dữ liệu | Báo sự kiện, xem Chương 44 |
#Chọn cơ chế nào
Tự làm thử
- Tạo một FIFO bằng
mkfifovà truyền một thông điệp giữa hai terminal. - Viết chương trình ghi và chương trình đọc riêng, giao tiếp qua FIFO.
- Chat hai chiều giữa hai tiến trình bằng hai FIFO.
- Mở FIFO với
O_NONBLOCKvà quan sátopenkhông còn chặn. - Cài giao tiếp hai chiều bằng socket Unix và so với dùng hai FIFO.
- Lập bảng: với ba tình huống thật, chọn cơ chế IPC phù hợp và giải thích.
Trình chấm điểm tự động sẽ được bổ sung ở giai đoạn sau. Hiện tại bạn tự chạy thử trên máy.
Tóm tắt
- FIFO là pipe có tên trên hệ tệp, tạo bằng
mkfifo, cho hai tiến trình bất kỳ nói chuyện. opentrên FIFO chặn cho tới khi có bên kia, là cơ chế đồng bộ tích hợp.- Khác biệt cốt lõi giữa pipe và FIFO là cái tên: FIFO không cần quan hệ họ hàng.
- Sáu cơ chế IPC; socket Unix là lựa chọn linh hoạt nhất, bộ nhớ chia sẻ nhanh nhất nhưng cần đồng bộ thủ công.
- Socket dùng chung API cho IPC cùng máy và giao tiếp qua mạng, nên nó mở rộng tự nhiên sang Phần 17.