
1
Bài 9. Unix IPC
Interprocess Communication
Ngô Duy Hòa – KHMT - CNTT
Nội dung bài học
• Signal.
• Pipes.
• Message Passing.
• Shared memory.
1. Signal
Các khái niệm cơ bản
• Signal: - software interrupt: hỗtrợthực hiện các
sựkiện không đồng bộ(asynchonous event)
đến tiến trình hoặc một nhóm tiến trình.:
– Sinh ra do người dùng nhấn 1 tổhợp phím (Ctrl+C,
Ctrl+Z,..)
– Sinh ra do 1 tiến trình này gửi đến tiến trình khác.
•Vềbản chất, signal là 1 số nguyên dương,
tương ứng với chỉsốtrong bảng Signal Table.
•Mỗi 1 signal đều có 1 chương trình xửlý mặc
định trong kernel.
Các khái niệm cơ bản
• Vai trò của Signal:
– Thông báo cho tiến trình biết 1 sựkiện xảy ra.
– Yêu cầu tiến trình xửlý sựkiện tương ứng.
•Các loại signal: Trong Linux có 2 loại:
– Regular Signal: tập các signal chuẩn trong các hệ
thống Unix/Linux. Nhận giá trị: 1-31
– Real-time Signal: các signal hỗtrợlàm việc ởchế độ
real-time. Thường được dùng trong các phiên bản
embedded linux. Signal nhận giá trị: 32-63.
– Phân biệt: Khi 1 signal được gửi nhiều lần liền nhau:
• real-time signal luôn được đưa vào hàng đợi (queue) và xử
lý nhiều lần,
• regular signal chỉxửlý một lần.

2
PCB & Signal Table Cơ chếthực hiện
• Khi 1 tiến trình nhận được 1 signal:
–Giátrịsignal sẽ được dùng để xác định vịtrí
signal trong signal table.
–Mỗi phần tửtrong bảng sẽtrỏ đến vịtrí hàm
xử lý signal tương ứng. Theo mặc định thì các
hàm này được xây dựng sẵn trong kernel.
–Nếu người dùng muốn xửlý theo cách của
mình Æxây dựng hàm xửlý riêng cho signal
rồi thông báo cho hệthống.
–Nếu signal bịnằm trong danh sách block Æ
tiến trình sẽkhông xửlý công việc gì.
Shell command & Signal
• Trong Shell, có thểdùng hàm kill để gửi 1
signal đến 1 tiến trình thông qua PID của
tiến trình.
• Cú pháp: $ kill -<signal> <PID>
•Trong đó <signal> thường bắt đầu bằng
cụm từ: SIG (ví dụSIGINT).
• Trong Shell có thểbỏqua SIG,chỉcần ghi
các ký tự đứng sau.
• Xem danh sách các signal: $ kill -l
Ví dụminh họa
non-stop.c

3
System call & Signal
•Nếu pid > 0 Ægửi signal đến tiến trình có PID.
•Nếu pid = 0 Ægửi signal đến nhóm tiến trình mà tiến
trình hiện tại đang nằm trong đó.
•Nếu pid = -1 Ægửi đến tất cảtiến trình ngoại trừtiến
trình init (PID = 1)
•Nếu pid < -1 Ægửi đến các tiến trình trong nhóm tiến
trình -PID
Ví dụsửdụng: kill
Bẫy tín hiệu
•Trong một số trường hợp, người dùng
không muốn OS xửlý các tín hiệu mặc
định Æcần bắt và xửlý riêng cho signal
•Hầu hết các signal đều có thểbắt, ngoại
trừ2 tín hiệu sau:
– SIGKILL: tắt tiến trình ngay lập tức.
–SIGSTOP: tạm ngưng tiến trình hiện tại. Tiến
trình được kích hoạt trởlại nếu được nhận tín
hiệu SIGCONT.
Cơ chếthực hiện

4
Bẫy và xửlý signal
• Chú ý: sighandler_t là một con trỏhàm, nhận
tham sốtruyền vào la 1 biến int.
• Có 2 hàm handler có sẵn:
– SIG_IGN: signal sẽ không được xử lý.
– SIG_DFL: signal được xư lý theo mặc định.
Ví dụvới signal
Một sốcác hàm khác
•Vấn đề tranh chấp xửlý tín hiệu:
–Một tín hiệu đang được xửlý thì một tín hiệu
tiếp theo được gửi đến.
–Vềnguyên tắc thì OS lại xửlý tín hiệu mới
sau đómới thực hiện với tín hiệu trước.
–Ækết quảxửlý tín hiệu không được đảm
bảo.
• Cách giải quyết:
–Thiết lập mặt nạcác tín hiệu để không cho
các tín hiệu xen vào quá trình đang xửlý.
Các hàm system call hỗtrợ
Sửdụng sigprocmask
•Ý tưởng:
– Dùng 1 biến thuộc cấu trúc sigset_t để lưu trữ
một tập các signal làm mặt nạ.
– Gán cơ chếlàm việc đối với tập tín hiệu đó:
• SIG_BLOCK: tập tín hiệu trong mặt nạbịkhóa.
• SIG_UNBLOCK: tập tín hiệu không bịkhóa.
• SIG_SETMASK: đặt lại mặt nạmới.
– Dùng các hàm:
• sigaddset (…) thêm 1 signal vào mặt nạ.
• sigdelset(…) xóa 1 tín hiệu khỏi mặt nạ,
Cách sửdụng

5
Sửdụng sigaction
2. Pipe (FIFO)
Cơ chếlàm việc
• PIPE là 1 đối tượng của OS, hỗtrợgiao
tiếp giữa các tiến trình:
– Output của tiến trình này là Input của tiến
trình kia.
–Thực hiện theo nguyên tắc FIFO.
– PIPE_BUF = PAGE_SIZE = 4K
•Có2 loại PIPE trong OS:
– PIPE không định danh (unnamed pipe)
–PIPE có định danh (named pipe).

