Tài liệu Truyền chuỗi giữa hai tiến trình sử dụng pipe

  • Số trang: 16 |
  • Loại file: DOCX |
  • Lượt xem: 2773 |
  • Lượt tải: 1
tranphuong

Tham gia: 04/08/2015

Mô tả:

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN BÁO CÁO BÀI TẬP LỚN MÔN HỆ ĐIỀU HÀNH Đề tài 3.26 Truyền chuỗi giữa hai tiến trình sử dụng Pipe Giảng viên: Thiều Xuân Khánh Sinh viên thực hiện: Nguyễn Tấn Phúc – 13520642 Trần Thiên Phú – 13520632 0 BÀI TẬP LỚN – HỆ ĐIỀỀU HÀNH MỤC LỤC ĐỀ TÀI........................................................................................................................ 2 I. II. HƯỚNG GIẢI QUYẾT BÀI TOÁN.....................................................................2 1. Sử dụng kênh liên lạc Pipe ( ống dẫn) để giao tiếp giữa hai tiến trình:..............2  Normal Pipe (Ống dẫn bình thường):....................................................................3  Named Pipe (Ống dẫn có tên):..............................................................................3 2. Thuật toán xử lý sử dụng ngôn ngữ C:.................................................................3 a) Tạo một Pipe:.......................................................................................................3 b) Tạo tiến trình.......................................................................................................4 III. PHÂN TÍCH CODE BÀI TOÁN...........................................................................4 1. Hàm xử lý chuỗi:.....................................................................................................4 2. Hàm kiểm tra việc đảo chữ:...................................................................................5 3. Code cho tiến trình thứ nhất..................................................................................6 4. Code cho tiến trình thứ hai:...................................................................................7 1 BÀI TẬP LỚN – HỆ ĐIỀỀU HÀNH I. ĐỀ TÀI Thiết kế một chương trình sử dụng ống dẫn bình thường. Chương trình sẽ tạo ra hai tiến trình: + Tiến trình thứ nhất sẽ gửi thông điệp dạng chuỗi cho tiến trình thứ hai. + Tiến trình thứ hai sẽ đảo các ký tự của chuỗi thông điệp, và gửi trả lại cho tiến trình thứ nhất. Vd: Nếu tiến trình thứ nhất gửi thông điệp “Hi There”, tiến trình thứ 2 sẽ trả lại “hI tHERE”. II. HƯỚNG GIẢI QUYẾT BÀI TOÁN  Sử dụng hai kênh liên lạc pipe để giao tiếp giữa hai tiến trình.  Sử dụng ngôn ngữ C để mô phỏng bài toán 1. Sử dụng kênh liên lạc Pipe ( ống dẫn) để giao tiếp giữa hai tiến trình: Pipe là một tiện ích được hỗ trợ tỏng hầu hết các ngôn ngữ lập trình vận hành trên các hệ thống đa nhiệm. Pipe cho phép hai quá trình nằm trên cùng một máy có thể trao đổi dữ liệu với nhau. Dữ liệu đi trên Pipe theo một chiều nhất định. Khi sử dụng Pipe, người ta dùng một đầu cho việc viết dữ liệu vào và một đầu còn lại cho việc đọc dữ liệu ra. Pipe thích hợp cho trường hợp dữ liệu tạo ra của quá trình này sẽ là dữ liệu đầu vào cho quá trình kia. Tuy nhiên ta cũng có thể sử dụng Pipe để xây dựng các ứng dụng theo kiến trúc Client – Server bằng cách sử dụng hai Pipe: một Pipe để truyền các yêu cầu (request), một Pipe để truyền các trả lời (reply). 2 BÀI TẬP LỚN – HỆ ĐIỀỀU HÀNH Có hai loại Pipe:  Normal Pipe (Ống dẫn bình thường): giới hạn trong phạm vi không gian địa chỉ của một quá trình. Nó chỉ cho phép giao tiếp giữa quá trình cha với các quá trình con hay giữa các quá trình con của một quá trình với nhau. Java hỗ trợ Pipe loại này. Trong đó các quá trình con được thay thế bởi các luồng.  Named Pipe (Ống dẫn có tên): Loại này có thể cho phép hai quá trình có không gian địa chỉ khác nhau (trên cùng một máy) giao tiếp với nhau. Thực chất nó giống như một tập tin với quy định rằng dữ liệu sẽ được lấy ra ở đầu tập tin và được thêm vào ở cuối tập tin. 2. Thuật toán xử lý sử dụng ngôn ngữ C: Do trong môi trường Linux đã hỗ trợ sẵn kiểu Pipe cũng như tạo ra đa tiến trình nên ta sử dụng để lập trình một cách đơn giản hơn trong WINDOWS. a) Tạo một Pipe: rc = pipe(chatoicon); Hàm trên đã tạo ra 1 pipe theo tên là chatoicon. Nhưng không phải lúc nào cũng tạo ra thành công 1 pipe mà nó có thể xảy ra các trường hợp sau:  Nếu rc = -1: Lỗi không tạo được pipe  Nếu rc = 0: Tạo được pipe đọc  Nếu rc = 0: Tạo được pipe ghi 3 BÀI TẬP LỚN – HỆ ĐIỀỀU HÀNH b) Tạo tiến trình Khi đã tạo được pipe ta cần phải tạo ra được 2 tiến trình hoạt động với nhau một cách song song và dùng pipe ta vừa tạo được đẻ giao tiếp giữa 2 tiến trình này. Để tạo được 2 tiến trình ta cần: pic = fork(); Do trong Linux đã hỗ trợ sẵn đa tiến trình nên ta chỉ cần gọi hàm fork() để tạo ra 2 tiến trình hoạt động một cách song song. CŨng như tạo pipe không phải lúc nào ta cũng tạo được thành công 2 tiến trình mà nó sẽ xảy ra các trường hợp sau:  Nếu pic = -1: Lỗi không tạo được tiến trình  Nếu pic khác -1 ta tạo được 2 tiến trình hoạt động một cách song song. III. PHÂN TÍCH CODE BÀI TOÁN 1. Hàm xử lý chuỗi: - Đổi ký tự hoa thành ký tự thường. Đổi ký tự thường sang ký tự hoa. char *toggleString(char *argv){ int i; char *str = malloc(sizeof(argv[1])); strcpy(str, argv); for(i=0;str[i]!='\0';i++) { if(str[i]>='A'&&str[i]<='Z'){ str[i]+=32; } else if (str[i]>='a'&&str[i]<='z') { str[i]-=32; } } return str; } 4 BÀI TẬP LỚN – HỆ ĐIỀỀU HÀNH 2. Hàm kiểm tra việc chuỗi nhập vào: int inputValidation(int argc, char *argv[]){ int i; bool c = false; char str[strlen(argv[1])]; strcpy(str, argv[1]); if (argc != 2) { fprintf(stderr, "\nUsage: %s or <'string 1, string 2', ..., string n'> for multiple strings\n", argv[0]); exit(EXIT_FAILURE); } else { for(i=0;i - Xem thêm -