YOMEDIA
ADSENSE
Bài giảng Lập trình IPC và thread - ĐH Bách khoa TP.HCM
207
lượt xem 11
download
lượt xem 11
download
Download
Vui lòng tải xuống để xem tài liệu đầy đủ
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.
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Lập trình IPC và thread - ĐH Bách khoa TP.HCM
- Lậ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 1
- Lậ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 2
- Lậ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 3
- Giớ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 4
- Giao 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 5
- Lậ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 6
- Giao 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 7
- Cá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 8
- Hai 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 9
- Unnamed 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 10
- Unnamed 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 13
- dup() #include int dup(int oldfd); stdin 0 stdin 0 dup(1) stdout 1 stdout 1 stderr 2 stderr 2 available 3 3 4 available 4 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 14
- dup2() #include int dup2(int oldfd, int newfd); stdin 0 stdin 0 dup2(1,4) stdout 1 stdout 1 stderr 2 stderr 2 available 3 3 4 available 4 Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 15
- #include int main() { // ps -ef | sort | grep int pipe1[2], pipe2[2]; pipe(pipe1); if (fork()) { /* Parent */ pipe(pipe2); if(fork()) { /* Parent */ close(0); // Close standard input dup(pipe2[0]); // standard input -> Read Pipe2 close(pipe1[0]); close(pipe1[1]); close(pipe2[0]); close(pipe2[1]); execl("/bin/grep", "grep", NULL); } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 16
- else { /* Child 2 */ close(0); // Close standard input dup(pipe1[0]); // standard input -> Read Pipe1 close(1); // Close standard output dup(pipe2[1]); // standard output -> Write Pipe2 close(pipe1[0]); close(pipe1[1]); close(pipe2[0]); close(pipe2[1]); execl("/bin/sort", "sort", NULL); } } else { /* Child 1 */ close(1); // Close standard output dup(pipe1[1]); // standard output -> Write Pipe1 close(pipe1[0]); close(pipe1[1]); execl("/bin/ps", "ps", "-ef", NULL); } exit(0); } Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 17
- Named pipe Tương tự như unnamed pipe Một số tính năng cần chú ý: Được ghi nhận trên file system (directory entry, file permission) Có thể dùng với các process không có quan hệ bố con Có thể tạo ra từ dấu nhắc lệnh shell (bằng lệnh mknod) Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 18
- Tạo named pipe - mknod() System call #include #include int mknod(const char *path, mode_t mode, dev_t dev); Trong đó path: đường dẫn đến pipe (trên file system) mode: quyền truy cập trên file = S_IFIFO kết hợp với trị khác dev: dùng giá trị 0 C/C++ library call #include #include int mkfifo(const char *pathname, mode_t mode); Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 19
- #include #include Dịch và thực thi #include $gcc fifo.c -o fifo #include $./fifo #include extern int errno; Parent writes to FIFO1: Test1 Child reads from FIFO1: Test1 #define FIFO1 "/tmp/fifo.1" Child feedbacks on FIFO2: Test2 #define FIFO2 "/tmp/fifo.2" Feedback data from FIFO2: Test2 #define PERMS 0666 int main(){ char s1[BUFSIZ], s2[BUFSIZ]; int childpid, readfd, writefd; Khoa KH&KTMT - Đại học Bách Khoa Tp. HCM 20
ADSENSE
CÓ THỂ BẠN MUỐN DOWNLOAD
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn