Đồ án mẫu NGUYÊN LÍ HỆ ĐIỀU HÀNH ( khoa CNTT)

32 296 0
Đồ án mẫu NGUYÊN LÍ HỆ ĐIỀU HÀNH ( khoa CNTT)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đồ án mẫu Nguyên Lý Hệ Điều Hành khoa Công nghệ thông tin Đại học bách khoa................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

ĐẠI HỌC ĐÀ NẴNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THƠNG TIN ĐỒ ÁN NGUN HỆ ĐIỀU HÀNH Đề tài : Tìm hiểu chế liên lạc đường ống PIPE tiến trình mơ lệnh “bc” Shell Linux GVHD SVTH LỚP NHÓM : Th.S Trần Hồ Thủy Tiên : : 15TCLC2 : Đà Nẵng 12-2017 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Lời cảm ơn Lần đầu thực đồ án môn học, bước đầu làm quen với việc tự tìm hiểu tự nghiên cứu kiến thức chuyên môn, em không tránh khỏi bỡ ngỡ sai sót bước đầu Thành cơng đồ án lần nhiều có giúp đỡ trực tiếp gián tiếp thầy cơ, gia đình bạn bè Trước hết em xin cảm ơn cô Trần Hồ Thủy Tiên, người giúp đỡ em nhiều trình thực đồ án Nhờ buổi giảng dạy môn lớp buổi thảo luận đề tài mang lại cho em kiến thức tảng vững để thực thành công đề tài lần Nếu khơng có giúp đỡ q giá đó, em khó lòng hồn thiện đồ án tiến độ Em xin cảm ơn thầy cô ‘Khoa Công Nghệ Thông Tin’ – Trường Đại Học Bách Khoa – Đại Học Đà Nẵng” mang đến kiến thức bổ ích cho sinh viên chúng em, góp phần gián tiếp cho thành công đồ án Em xin kính chúng Trần Hồ Thủy Tiên thầy cô dồi sức khỏe, tâm huyết tràn đầy để tiếp tục dẫn dắt sinh viên đến thành công vang dội Đà Nẵng, ngày 26 tháng 12 năm 2017 Sinh viên thực (ký ghi họ tên) Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Nhận xét giáo viên hướng dẫn Đà Nẵng, ngày … tháng … năm 2017 Giáo viên hướng dẫn (ký ghi rõ họ tên) ThS Trần Hồ Thủy Tiên Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Nhận xét giáo viên phản biện Đà Nẵng, ngày … tháng … năm 2017 Giáo viên phản biện (ký ghi rõ họ tên) Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Mục lục Mục lục Danh mục hình vẽ Mở Đầu Mục đích đồ án Nguyên Hệ điều hành: Mục tiêu đề tài: .4 Nội dung báo cáo: Chương I TIẾN TRÌNH VÀ CƠ CHẾ LIÊN LẠC LIÊN TIẾN TRÌNH Giới thiệu: .5 Tiến trình: .5 Hoạt động tiến trình 3.1 Khởi tạo tiến trình: 3.2 Kết thúc tiến trình: 3.3 Thực thi chương trình: .7 Liên lạc tiến trình: 4.1 Nhu cầu liên lạc tiến trình vấn đề nảy sinh: 4.2 Tín hiệu (Signals): 4.3 Pipes: 4.4 Sockets: 4.5 Message Queues: .9 4.6 Semaphores: 10 4.7 Shared Memory: 11 Chương II PHƯƠNG PHÁP PIPE 12 Đường ống chiều(Half-duplex): 12 1.1 Khái niệm bản: 12 1.2 Tạo đường ống chiều: .13 1.3 Một vài lưu ý: 14 Đường ống đặt tên (Named pipes): .15 2.1 Khái niệm bản: 15 2.2 Tạo FIFO: .15 Chương III MÔ PHỎNG ĐƠN GIẢN LỆNH “BC” TRONG SHELL .15 Mô tả vấn đề: 15 Lệnh “bc”: .16 Thuật toán: 16 Chương trình: 17 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên 4.1 Các hàm sử dụng: .17 4.2 Cơ chế hoạt động chương trình: 18 Thực thi kết quả: 20 Chương IV KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 20 Kết luận 20 Hướng phát triển: 21 Tài liệu tham khảo 22 Phụ lục 23 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Danh mục hình vẽ Hình I.1: Mơ hình tiến trình Hình I.2: Cây phả hệ tiến trình Hình I.3: Các loại tín hiệu hệ thống Hình I.4: Mơ tả đường ống Hình I.5: Mô tả Message Queue 10 Hình I.6: Mơ tả Semaphore 11 Hình I.7: Mơ tả Shared Memory 12 Hình II.1: Mơ tả tiến trình nhân sau đường ống khởi tạo 12 Hình II.2: Liên lạc tiến trình cha 13 Hình II.3: Sau đóng cổng thích hợp 13 Hình III.1: Giao diện lệnh bc 16 Hình III.2: Sau khởi tạo tiến trình đường ống 18 Hình III.3: Sau đóng cổng khơng cần thiết 20 Hình III.4: Tính toán đơn giản 20 Hình III.5: Biểu thị kí tự không hợp lệ 20 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Mở Đầu Mục đích đồ án Nguyên Hệ điều hành: Nguyên Hệ điều hành mơn học tập trung nghiên cứu chuyên sâu quản phân phối tài ngun máy tính cho chương trình người dùng Mơn học chứa đựng nhiều kiến thức bổ ích cho sinh viên khía cạnh nằm lớp hệ thống máy tính bao gồm tiến trình giao tiếp tiến trình, cấp phát tài nguyên, lưu trữ liệu, giải tắc nghẽn,… Đồ án nhằm mục đích giúp cho sinh viên tiếp cận thực hóa kiến thức liên quan đến môn học NguyênHệ điều hành đồng thời tạo điều kiện rèn luyện nâng cao kĩ năng:  Tổng hợp kiến thức học phương diện  Tính tự chủ tinh thần trách nhiệm công việc  Khả thiết kế lập trình  Khả báo cáo luận văn  Khả thuyết trình bảo vệ đồ án Mục tiêu đề tài: Từ hệ điều hành đại cung cấp khả đa chương trình, tiến trình khơng thể hoạt động độc lập với phải có phương thức cho chúng liên lạc với để đảm bảo tồn vẹn hệ thống Một đề tài tìm hiểu vấn đề cần thiết Đề tài “Tìm hiểu chế liên lạc đường ống PIPE tiến trình mơ lệnh “bc” Shell Linux” lần mục tiêu tiếp cận đào sâu kiến thức tảng Nguyên Hệ điều hành nói chung tiến trình chế liên lạc đường ống PIPE tiến trình nói riêng Qua đó, chương trình mơ nhỏ tạo nên để giúp sinh viên nắm vững kiến thức nêu trên, rèn luyện kĩ vận dụng thực hóa kiến thức học hỏi nghiên cứu Nội dung báo cáo: Báo cáo gồm chương: Chương I: Tiến trình chế liên lạc liên tiến trình giúp ta có nhìn tổng quan tiến trình, giao tiếp chúng hệ điều hành Linux Chương II: Phương pháp PIPE làm rõ đào sâu chế liên lạc đường ống PIPE tiến trình Chương III: Mơ đơn giản lệnh “bc” Shell vận dụng kiến thức tìm hiểu để xây dựng chương trình mơ ứng dụng Chương IV: Kết luận hướng phát triển nêu thành đạt phương hướng tới đề tài Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Chương I TIẾN TRÌNH VÀ CƠ CHẾ LIÊN LẠC LIÊN TIẾN TRÌNH Giới thiệu: Tiến trình khái niệm trừu tượng lâu đời quan trọng hệ điều hành Chúng cung cấp khả thực thi (ảo) lúc nhiều thao tác dù có CPU (central processing unit), biến CPU thành nhiều CPU ảo Nếu khơng có khái niệm này, hệ điều hành đại khơng tồn Khi máy tính sử dụng hệ điều hành cũ, cơng việc xử : Người dùng thực câu lệnh hình cửa sổ chính, hệ điều hành liên tục thực thi lệnh thực xong hay buộc phải ngừng lại có yêu cầu tự chương trình buộc người dùng phải nhập vào câu lệnh thông tin Những lúc vậy, người dùng chưa nhập vào, CPU dừng hoạt động theo nghĩa đen Khơng chương trình khác thực thi, yêu cầu khác từ hệ điều hành máy chủ phải đợi chừng trỏ lệnh nhấp nháy Điều tạo phí phạm lớn tốc độ xử CPU ngày nhanh khiến thời gian đợi người người dùng nhập vào hàng thiên niên kỉ so với thời gian CPU xử cơng việc Trong hệ thống đa chương trình (multiprogramming) CPU, CPU chuyển đổi việc thực thi tiến trình nhanh, dành khoảng vài chục đến vài trăm mili-giây cho tiến trình Vì khoảng thời gian thực thi ngắn, nên giây, nhiều cơng việc xử lí, tạo ảo giác thực thi song song Trái ngược với ảo giác hệ thống với nhiều CPU chia sẻ chung nhớ vật để tạo song song thật Việc nắm bắt nhiều hoạt động, chương trình diễn lúc khó khăn nên qua nhiều năm, mơ hình khái niện(tiến trình tuần tự) hình thành phát triển để giúp thực thi song song dễ hiểu Tiến trình: Trong hệ điều hành đại Linux, chương trình thực thi máy tính bao gồm hệ điều hành chia thành tiến trình hay nói ngắn gọn tiến trình Tiến trình thực thể (instance) chương trình thực thi, chứa đựng giá trị đếm chương trình (program counter), ghi (registers) biến Nếu chương trình dòng lệnh liệu lưu trữ máy tính, tiến trình xem chương trình xử Hình I.1: Mơ hình tiến trình Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Hình (a) chương trình đa chương trình gồm chương trình nhớ Hình (b) tiến trình với tiến trình có đếm chương trình logic riêng Do chúng thực thi hoàn toàn độc lập so với Tuy nhiên có mơt đếm chương trình vật lí, nên thực thi đếm chương trình logic nạp đếm vật Khi tiến trình thực thi xong (tạm thời), đếm vật lưu trữ vào đếm logic tiến trình tương ứng nhớ Còn hình (c), xét khoảng thời gian dài tiến trình thực cơng việc, có chương trình thực thi thời điểm Dù sử dụng mơ hình nào, thời điểm có tiến trình thực thi Luồng(Thread) phận tiến trình Nó tiểu trình (microprocess) nằm bên tiến trình để đảm nhiệm nhiệm vụ khác tiến trình Các luồng có vùng nhớ riêng luồng tiến trình sử dụng chung vùng nhớ Điều cho phép luồng sử dụng tài nguyên nằm vùng nhớ Các lợi ích luồng:  Một số tiến trình phải xử nhiều cơng việc lúc Các cơng việc thường chặn lẫn Chia nhỏ tiến trình thành tiểu trình đảm nhiệm cơng việc riêng biệt khiến việc lập trình trở nên đơn giản  Cơ chế liên lạc đơn giản tiến trình khiến việc chuyển đổi ngữ cảnh luồng tốn chi phí  Khi hệ thống trở nên nhanh mạnh hơn, luồng khiến công việc chạy chồng lên Điều tăng cao hiệu toàn hệ thống  Đồng thời luồng dễ dàng khỏi tạo phá hủy tiến trình Khi cơng việc khơng cần nữa, việc phá hủy luồng đơn giản ảnh hưởng tiến trình Nhược điểm:  Các luồng khơng hoạt động độc lập tiến trình Sự đổ luồng kéo theo sụp đổ tiến trình  Các luồng dùng chung vùng nhớ tài nguyên tiến trình Điều dễ gây xung đột, nhảy cóc luồng Hoạt động tiến trình 3.1 Khởi tạo tiến trình: Tiến trình khởi tạo tiến trình khác Ta gọi tiến trình khởi tạo tiến trình cha tiến trình khởi tạo tiến trình Khi hệ thống (Linux) khởi động, có tiến trình tạo Tiến liên tục tạo tiến trình khác lời gọi hệ thống fork(), vfork(), clone(), wait() exec() để thực thi cơng việc sau quay trở trạng thái nghỉ(idle) Tùy thuộc vào lời gọi hàm, tiến trình nhận nội dung giống với tiến trình cha chia sẻ số tài nguyên, điểm khác PID chúng vị trí chúng lưu nhớ, riêng exec() tiến trình nhận ln PID cha Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên #include #include main() { int fd[2]; pipe(fd); } Sau tiếp tục sử dụng lời gọi fork() để khởi tạo tiến trình Cần lưu ý rằng, nói cách đơn giản, fork() trả giá trị nguyên dương lớn tiến trình cha thực thi, giá trị tiến trình thực thi Khi giá trị trả -1, việc khởi tạo thất bại Bởi muốn gửi thơng tin từ tiến trình cha, nên cần đóng đầu đọc đường ống đầu ghi đường ống cha if((childpid = fork()) == -1) { /* In lỗi */ perror("fork"); exit(1); } if(childpid == 0) { /* Đóng đầu vào tiến trình */ close(fd[0]); } else { /* Đóng đầu tiến trình cha */ close(fd[1]); } 1.3 Một vài lưu ý:  Các đường ống hai chiều tạo cách tạo hai đường ống, sau đóng cổng thích hợp để có chiều truyền liệu tương ứng  Lời gọi pipe() phải gọi trước lời gọi fork() để tiến trình thừa kế đường ống tạo  Với đường ống chiều, tiến trình liên kết với phải chia sẻ nguồn gốc mà sinh đường ống Nếu tiến trình khác nguồn gốc, chúng hồn tồn khơng thể sử dụng đường ống 14 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Đường ống đặt tên (Named pipes): 2.1 Khái niệm bản: Đường ống đặt tên, hay gọi FIFO (Vào trước trước – First In First Out), hoạt động giống đường ống thơng thường Tuy nhiên có vài điểm khác biệt cần lưu ý:  Đường ống đặt tên tồn file thiết bị đặc biệt (device special file) hệ thống file  Các tiến trình khơng nguồn gốc chia sẻ liệu thông qua đường ống  Khi q trình vào/ra hồn thành tiến trình, đường ống đặt tên không mà hệ thống file để sử dụng sau 2.2 Tạo FIFO: Trong Shell, ta tạo hai cách: mknod MYFIFO p mkfifo a=rw MYFIFO Cả hai cách hoạt động gần giống Tuy nhiên mkfifo cho phép thay đổi quyền hạn(đọc-ghi-thực thi) sau khởi tạo với mknod, lệnh chmod cần thiết Trong ngơn ngữ lập trình C, lời gọi mknod sau:  PROTOTYPE: int mknod( char *pathname, mode_t mode, dev_t dev);  RETURNS: o on success, o -1 on error: errno =  EFAULT (đường dẫn không hợp lệ)  EACCES (từ chối truy cập)  ENAMETOOLONG (tên đường dẫn dài)  ENOENT (đường dẫn không hợp lệ)  ENOTDIR (đường dẫn không hợp lệ) Một ví dụ đơn giản khởi tạo FIFO: mknod("/tmp/MYFIFO", S_IFIFO|0666, 0); Ở file “/tmp/MYFIFO” tạo dạng file FIFO, quyền hạn yêu cầu “0666”, tham số thứ ba bỏ qua ta khởi tạo FIFO Chương III MÔ PHỎNG ĐƠN GIẢN LỆNH “BC” TRONG SHELL Mô tả vấn đề: Sau tìm hiểu phương thức liên lạc tiến trình, đặc biệt liên lạc đường ống PIPE, ứng dụng để trình bày cách thức hoạt động đường ống hệ thống cần thiết Ở báo cáo này, chương trình dựng lên để mô tả câu lệnh “bc” Shell sử dụng hai tiến trình thuật tốn nghịch đảo Ba Lan 15 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Tiến trình thứ cho phép người dùng nhập từ bàn phím chuỗi biểu diễn phép tính gồm tốn tử “+” (cộng), “-“ (trừ), “*” (nhân), “/” (chia), “(“ (ngoặc trái), “)” (ngoặc phải) số nguyên không dấu Các phép cộng trừ có độ ưu tiên, phép nhân chia có độ ưu tiên lớn cộng trừ, nhiên phép tính ngoặc có độ ưu tiên lớn Ví dụ: 1+2+(2-3-4)-((3+4)-5) Tiến trình thứ hai truyền chuỗi liệu sang đường ống, thực tính tốn truyền chuỗi kết cho tiến trình thứ thể cho người dùng biết Lệnh “bc”: bc ngôn ngữ hỗ trợ số xác tùy ý với việc thực thi câu lệnh có tính tương tác bc thực đoạn mã file liệt kê giao diện dòng lệnh cách Ngơn ngữ cho phép tính tốn xác số cực lớn cực nhỏ mà không gặp vấn đề Hình III.1: Giao diện lệnh bc Trong giao diện dòng lệnh, bc cung cấp số chức năng:  help: Hiện thị hỗ trợ  -h, help: In cách sử dụng  file: Một file chứa tính tốn/hàm cần thực File đưa đến từ đầu vào chuẩn (standard input) thông qua đường ống  -l, interactive: Định nghĩa thư viện toán chuẩn  -v, version: Hiển thị phiên bản, copyright sau Báo cáo mơ đơn giản ứng dụng bc giao diện dòng lệnh: Xử biểu thức tính tốn trung tố nhập “quit” Thuật tốn: Ở để mơ bc, ta cần phải làm việc với biểu thức trung tố Tuy nhiên biểu thức trung tố thường gây khó khăn cho máy tính việc tính tốn phải bỏ lượng công việc đáng kể xác định thứ tự ưu tiên phép tính Vì biểu thức cần chuyển sang tiền tố hậu tố (hay gọi kí pháp Ba Lan) để tính tốn đơn giản Ở ta sử dụng thuật toán bẻ ghi Edgar Dijkstra để chuyển từ biểu thức trung tố sang biểu thức hậu tố Bằng cách sử dụng hai ngăn xếp để chứa toán tử toán hạng, thuật toán cài đặt vào ngơn ngữ C Thuật toán miêu tả kĩ http://www.cis.upenn.edu/matuszek/cit594-2002/Assignments/5-expressions.html Dưới trình bày lại thuật tốn: Khi kí tự đọc vào 16 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên 1.1 Đọc kí tự 1.2 Nếu kí tự là: 1.2.1 Số: đẩy vào ngăn xếp giá trị 1.2.2 Dấu ngoặc trái: đẩy vào ngăn xếp toán tử 1.2.3 Dấu ngoặc phải: Khi đỉnh ngăn xếp tốn tử khơng phải dấu ngoặc trái, Lấy toán tử khỏi ngăn xếp toán tử Lấy ngăn xếp hai lần, nhận hai tốn hạng Tính tốn hai giá trị dựa theo toán tử, theo thứ tự Đẩy kết tìm vào ngăn xếp giá trị Lấy dấu ngoặc trái khỏi ngăn xếp tốn tử, vứt bỏ 1.2.4 Tốn tử(gọi tốn tử thisOp): Khi ngăn xếp tốn tử khơng rỗng, đỉnh ngăn xếp tốn tử có ưu tiên lớn thisOp, Lấy toán tử khỏi ngăn xếp toán tử Lấy ngăn xếp hai lần, nhận hai tốn hạng Tính toán hai giá trị dựa theo toán tử, theo thứ tự Đẩy kết tìm vào ngăn xếp giá trị Đẩy thisOP vào ngăn xếp tốn tử Khi ngăn xếp tốn tử khơng rỗng, 2.1 Lấy toán tử khỏi ngăn xếp toán tử 2.2 Lấy ngăn xếp hai lần, nhận hai tốn hạng 2.3 Tính tốn hai giá trị dựa theo toán tử, theo thứ tự 2.4 Đẩy kết tìm vào ngăn xếp giá trị Đến đây, ngăn xếp toán tử rỗng, ngăn xếp giá trị giá trị kết cuối Chương trình: 4.1 Các hàm sử dụng: Các hàm ngăn xếp để cài đặt ngăn xếp dựa vào mảng C, bao gồm hàm:  push(): đẩy phần tử vào ngăn xếp  pop(): lấy phần tử khỏi ngăn xếp  top(): trả phần tử ngăn xếp  isEmpty(): kiểm tra ngăn xếp có rỗng hay khơng Các lời gọi hệ thống sau sử dụng để liên lạc chương trình: 17 Đồ Án Ngun Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên      pipe(): tạo đường ống với tham số đầu vào mảng có phần tử fork(): tạo tiến trình từ tiến trình cha read(): đọc chuỗi kí tự từ đường ống write(): ghi chuỗi kí tự vào đường ống close(): đóng đầu đối diện đường ống đọc/ghi để tránh trường hợp ống rỗng đầy ống khiến hai tiến trình bị xung đột đợi mãi  wait(): sử dụng cho tiến trình cha, đợi đến tiến trình kết thúc quay lại thực thi  exit(): thoát khỏi tiến trình thực thi Ngồi sử dụng số hàm thao tác chuỗi thư viện string.h 4.2 Cơ chế hoạt động chương trình: Để liên lạc hai chiều hai tiến trình cha con, cần thiết phải tạo hai đường ống riêng biệt cách sử dụng lời gọi hàm pipe() lên hai mảng fd1 fd2, sau sử dụng lời gọi hàm fork() để tiến trình nhận hai đường ống tương tự Hình III.2: Sau khởi tạo tiến trình đường ống Tiến trình cha sau nhận biểu thức tính tốn đầu vào, ghi biểu thức tính tốn fd1[1] gửi qua tiến trình con, tiến trình đọc liệu từ fd1[0], tất ống thứ Dưới câu lệnh mơ tả: // Tiến trình cha else if (p > 0) { close(fd1[0]); // Đóng cổng đọc ống // Ghi đoạn biểu thức nhập vào đóng ống // write(fd1[1], str, strlen(str)+1); close(fd1[1]); // Đợi đến hàm thực thi xong wait(NULL); … } // Tiến trình else { 18 Đồ Án Ngun Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên close(fd1[1]); // Đóng đầu ghi ống // Đọc chuỗi string từ đầu đọc ống read(fd1[0], str, 20); … } Sau đó, biểu thức tính tốn tiến trình thơng qua phần Thuật tốn trình gửi cách ghi vào đầu fd2[1] tiến trình cha đọc liệu từ fd2[0] Tuy nhiên trước thực thao tác đọc ghi, cần phải đóng cổng đối diện ống cần đọc ghi lại để tránh tràn ống ống rỗng, ví dụ đọc đầu fd1[0] cần phải đóng fd2[0] lệnh close() Mơ tả lệnh dưới: // Tiến trình cha else if (p > 0) { … close(fd2[1]); // Đóng đầu ghi ống thứ // Đọc chuỗi kết từ tiến trình đóng // đầu đọc read(fd2[0], ans_str, 20); printf("%s\n", ans_str); close(fd2[0]); } // Tiến trình else { … // Đóng hai đầu đọc close(fd1[0]); close(fd2[0]); // Gửi kết tính tốn tiến trình cha write(fd2[1], str, strlen(str)+1); close(fd2[1]); exit(0); } 19 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Hình III.3: Sau đóng cổng không cần thiết Thực thi kết quả: Chương trình thực biểu thức cơng trừ nhân chia đơn giản với số tự nhiên Hình III.4: Tính tốn đơn giản Khi gặp phải kí tự lạ chương trình trả chuỗi “Khong hop le” hình Hình III.5: Biểu thị kí tự khơng hợp lệ Chương trình thực tốt chương trình khơng nhận số ngun có dấu tốn hạng nhập vào không vượt giới hạn kiểu int ngơn ngữ lập trình C Chương IV KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Kết luận Đồ án lần sở tiền đề cho việc tìm hiểu sâu mảng quan trọng Nguyên hệ điều hành Qua số kết đạt trình tìm hiểu nghiên cứu:  Nắm khái niệm tiến trình, giao tiếp tiến trình Linux  Có kiến thức tảng giao tiếp đường ống PIPE Linux  Mô đơn giản thành cơng lệnh bc Shell qua nâng cao khả lập trình Linux sử dụng lời gọi hệ thống  Khả tự học, tự nghiên cứu, giải vấn đề Tuy nhiên số hạn chế cần phải khắc phục chưa hoàn toàn đào sâu phương thức giao tiếp PIPE khác, chương trình khai thác giao tiếp tiến trình mức độ đơn giản, tính tốn số lớn chưa hồn thiện 20 Đồ Án Ngun Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Hướng phát triển: Tiếp tục nghiên cứu để giải vấn đề trên:  Tính số lớn cực lớn  Đào sâu khai thác giao tiếp tiến trình 21 Đồ Án Ngun Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Tài liệu tham khảo [1] The Linux Document Project - http://www.tldp.org [2] Andrew S Tanenbaum (2015), Modern Operating Systems (Forth Edition), Pearson Prentice Hall [3] Richard Fox, Linux with Operating System Concepts [4] Trần Hồ Thủy Tiên, Bài giảng Nguyênhệ điều hành, Khoa CNTT trường Đại học Bách Khoa Đà Nẵng 22 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên Phụ lục // C program to demonstrate use of fork() and pipe() #include #include #include #include #include #include void push(int *stack, int *top, int item) { //printf(" pushing : %d ", item); stack[*top] = item; (*top)++; } int pop(int *stack, int *top) { int temp; (*top) ; temp = stack[*top]; //printf(" popping : %d\n",temp); return temp; } int top(int *stack, int *top) { return stack[*top - 1]; } int isEmpty(int *top) { if(*top == 0) return 1; else return 0; } int calc(int value1, int value2, int sign) { //printf("\nValue2 = %d", value2); //printf("\nValue1 = %d", value1); switch(sign) { case '+':return value1 + value2; 23 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên case '-':return value1 - value2; case '*':return value1 * value2; case '/':return value1 / value2; } return 0; } // if op2 >= op1 return true int hasPrecedence(int op1, int op2) { if(op2 == ')' || op2 == '(') return 0; else if((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) return 0; else return 1; } int isQuit(char *str) { if(str[0] == 'q' && str[1] == 'u' && str[2] == 'i' && str[3] == 't') return 1; else return 0; } int main() { // Ta dùng hai pipe // Pipe thứ gửi biểu thức từ cha sang // Pipe thứ hai gửi kết từ sang cha int fd1[2]; // Dùng để chứa hai đầu ống int fd2[2]; // Dùng để chứa hai đầu ống int optop = , numtop = 0, i = 0, k = , numstack[50] , opstack[30], ans = 0; char str[100], c, ans_str[100], numbStr[20]; pid_t p; printf("Phan mem tinh toan cac bieu thuc trung to bang cach chuyen sang dang hau to roi tinh toan Nhap \"quit\" de thoat.\n"); while(1) { // Đọc kí tự khơng phải \n scanf("%[^\n]%*c", str); 24 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên if(isQuit(str)) break; if (pipe(fd1)==-1) { fprintf(stderr, "Pipe Failed" ); return 1; } if (pipe(fd2)==-1) { fprintf(stderr, "Pipe Failed" ); return 1; } p = fork(); if (p < 0) { fprintf(stderr, "fork Failed" ); return 1; } // Tiến trình cha else if (p > 0) { close(fd1[0]); // Đóng cổng đọc ống // Ghi đoạn biểu thức nhập vào đóng ống // write(fd1[1], str, strlen(str)+1); close(fd1[1]); // Đợi đến hàm thực thi xong wait(NULL); close(fd2[1]); // Đóng đầu ghi ống thứ // Đọc chuỗi kết từ tiến trình đóng // đầu đọc read(fd2[0], ans_str, 100); 25 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên printf("%s\n", ans_str); close(fd2[0]); } // child process else { close(fd1[1]); // Đóng đầu ghi ống // Đọc chuỗi string từ đầu đọc ống read(fd1[0], str, 100); i = 0; // Tính tốn biểu thức sau đưa giá trị vào chuỗi kết while(str[i] != '\0') { c = str[i]; // neu la so thi day vao stack if(c >= '0' && c = '0' && c pop value) int kq = calc(pop(numstack, &numtop), pop(numstack, &numtop), pop(opstack, &optop)); push(numstack, &numtop, kq); } push(opstack, &optop, c); } else if(c == ' ') { // nothing } else { close(fd1[0]); close(fd2[0]); strncpy(str, "Khong hop le", 20); while(!isEmpty(&optop)) { pop(opstack, &optop); } while(!isEmpty(&numtop)) { pop(numstack, &numtop); } // Gửi kết tính tốn tiến trình cha write(fd2[1], str, strlen(str)+1); close(fd2[1]); 27 Đồ Án Nguyên Hệ Điều Hành GVHD: Trần Hồ Thủy Tiên exit(0); } i++; } while(!isEmpty(&optop)) { int kq = calc(pop(numstack, &numtop), pop(numstack, &numtop), pop(opstack, &optop)); push(numstack, &numtop, kq); } ans = pop(numstack, &numtop); // Chuyển kiểu int thành string sprintf(str, "%d", ans); // Đóng hai đầu đọc close(fd1[0]); close(fd2[0]); // Gửi kết tính tốn tiến trình cha write(fd2[1], str, strlen(str)+1); close(fd2[1]); exit(0); } } return 0; } 28

Ngày đăng: 24/06/2018, 20:02

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan