Bỏ qua điều hướng, tới nội dung chính
Học C
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

PipeFIFO (named pipe)
Tạo bằngpipe()mkfifo()
Có tên trên hệ tệpKhôngCó
Giữa tiến trình nàoChỉ họ hàng (cha con, anh em)Bất kỳ
ChiềuMột chiềuMột chiều
Tồn tại khi nàoTrong khi tiến trình sốngTới khi unlink
Dùng chocmd1 | cmd2 trong shellHai chương trình rời nói chuyện

#Sáu cơ chế IPC

Cơ chếĐặc điểmDùng khi
PipeMột chiều, cha con, đơn giảnNối lệnh, giao tiếp cha con nhanh
FIFOMột chiều, tiến trình bất kỳHai chương trình rời trên cùng máy
Socket UnixHai chiều, nhanh, linh hoạtGiao 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épTruyền dữ liệu lớn, cần đồng bộ thủ công
Hàng đợi thông điệpCó cấu trúc, có ưu tiênThông điệp rời rạc có độ ưu tiên
Tín hiệuThông báo đơn giản, không mang dữ liệuBáo sự kiện, xem Chương 44

#Chọn cơ chế nào

Tự làm thử

  1. Tạo một FIFO bằng mkfifo và truyền một thông điệp giữa hai terminal.
  2. Viết chương trình ghi và chương trình đọc riêng, giao tiếp qua FIFO.
  3. Chat hai chiều giữa hai tiến trình bằng hai FIFO.
  4. Mở FIFO với O_NONBLOCK và quan sát open không còn chặn.
  5. Cài giao tiếp hai chiều bằng socket Unix và so với dùng hai FIFO.
  6. 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.
  • open trê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.