Thông tin tài liệu:
Bài giảng Lập trình IPC và thread bao gồm những nội dung về lập trình trên Linux; giới thiệu về IPC; giao tiếp thông qua PIPE; tác vụ trên pipe; hai loại pipe; dùng pipe để tái định hướng; lập trình thread; lập trình POSIX pthread; giải quyết tranh chấp trên POSIX thread.
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình IPC và thread - ĐH Bách khoa TP.HCMLập trình IPC và thread Bộ môn Hệ thống và Mạng máy tính Khoa Khoa học và kỹ thuật máy tính Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 1Lập trình trên Linux Lập trình IPC Dùng pipe Dùng semaphore Lập trình thread Cơ bản về lập trình POSIX pthread Giải quyết tranh chấp trên POSIX thread Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 2Lập trình trên Linux Lập trình IPC Dùng pipe Dùng semaphore Lập trình thread Cơ bản về lập trình POSIX pthread Giải quyết tranh chấp trên POSIX thread Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 3Giới thiệu về IPC Mục tiêu của IPC IPC: Inter-Process Communication Cho phép phối hợp hoạt động giữa các quá trình trong hệ thống Giải quyết đụng độ trên vùng tranh chấp Truyền thông điệp từ quá trình này đến các quá trình khác Chia sẻ thông tin giữa các quá trình với nhau Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 4Giao tiếp và đồng bộ Communication Synchronization Truyền dữ liệu Giải quyết tranh chấp Chia sẻ thông tin Đảm bảo thứ tự xử lý Các cơ chế: Các cơ chế: Pipe Lock file Signal Semaphore Message queue Mutex (pthread) Shared memory Socket RPC/RMI Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 5Lập trình trên Linux Lập trình IPC Dùng pipe Dùng semaphore Lập trình thread bằng pthread Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 6Giao tiếp thông qua PIPE Là kênh truyền dữ liệu giữa các process với nhau theo dạng FIFO Writer Reader P1 P2 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 7Các tác vụ trên pipe Write: #include ssize_t write(int fd, const void *buf, size_t count) Read: #include ssize_t read(int fd, const void *buf, size_t count) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 8Hai loại pipe Unnamed pipe có ý nghĩa cục bộ chỉ dành cho các process có quan hệ bố con với nhau Named pipe (còn gọi là FIFO) có ý nghĩa toàn cục có thể sử dụng cho các process không liên quan bố con Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 9Unnamed pipe Tạo unnamed pipe: #include int pipe(int filedes[2]); Kết quả Thành công, kết quả thực thi hàm pipe() là 0, có hai file descriptor tương ứng sẽ được trả về trong filedes[0], filedes[1] Thất bại: hàm pipe() trả về -1, mã lỗi trong biến ngoại errno Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 10Unnamed pipe (2) filedes[1] -----> filedes[0] P0 P1 filedes[0] ----- filedes[1] Duplex Linux: unidirectional/half-duplex, i.e. filedes[0] chỉ được dùng để đọc còn filedes[1] chỉ được dùng để ghi dữ liệu Solaris: full-duplex, i.e. nếu ghi vào filedes[0], thì filedes[1] được dùng để đọc và ngược lại Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 11#include Dịch, thực thi#include #include $gcc unpipe.c -o unpipe#include int main() { $./unpipe int fp[2]; Input: I Love Penguin char s1[BUFSIZ], s2[BUFSIZ]; From pipe> I Love Penguin pipe(fp); if (fork()==0) { /* Child Write */ $ printf(\nInput: ); fgets(s1,BUFSIZ,stdin); s1[strlen(s1)]=0; close(fp[0]); write(fp[1],s1,strlen(s1)+1); } else { /* Parent Read */ close(fp[1]); read(fp[0],s2,BUFSIZ); printf(\nFrom pipe> %s\n, s2); } return 0; Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 12}Dùng pipe để tái định hướng Pipe có thể được dùng để kết nối các lệnh với nhau (do chương trình shell thực hiện) Ví dụ: $ ps -ef | grep a01 | sort $ ls | more Đối với chương trình người dùng, có thể dùng một trong hai system call sau kết hợp với pipe đểthực hiện: dup() dup2() ps -ef | grep $USER | ... cmd1 cmd2 . . . cmdN Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 13dup()#include int dup(int oldfd); stdin 0 stdin 0 dup(1) stdout 1 stdout 1 stderr 2 stderr 2available 3 3 4 available 4 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 14dup2()#include int dup2(int oldfd, int newfd); stdin 0 stdin 0 dup2(1,4) stdout 1 stdout 1 stderr 2 stderr 2available 3 3 4 ava ...