intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Lập trình IPC và thread - ĐH Bách khoa TP.HCM

Chia sẻ: Lavie Lavie | Ngày: | Loại File: PDF | Số trang:60

205
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.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Lập trình IPC và thread - ĐH Bách khoa TP.HCM

  1. 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
  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 2
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. #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 }
  13. 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
  14. 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
  15. 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
  16. #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
  17. 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
  18. 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
  19. 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
  20. #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

 

Đồng bộ tài khoản
2=>2