You are on page 1of 9

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

MÔN HỆ ĐIỀU HÀNH


BÀI TẬP THỰC HÀNH LAB 6
GVHD: Lê Hoài Nghĩa
Sinh viên thực hiện:
1. Hà Xuân Bắc - 22520088
2. Dương Quốc Anh - 22520043
3. Phan Thị Thủy Hiền - 22520423
4. Đặng Vĩnh Hội - 22520490

 Tp. Hồ Chí Minh, 12/2023 


IT007– Hệ điều hành
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................

……., ngày……...tháng……năm 2023

Người nhận xét


(Ký tên và ghi rõ họ tên)

PAGE \* MERGEFORMAT 14 | Page


IT007– Hệ điều hành

BẢNG PHÂN CÔNG CÔNG VIỆC

Họ tên Nội dung công việc

Hà Xuân Bắc Thực hiện câu 2 phần thực hành

Đặng Vĩnh Hội Thực hiện câu 1,5 phần thực hành

Dương Quốc Anh Thực hiện câu 3,4 phần thực hành

Phan Thị Thủy Hiền Thực hiện câu 1 phần thực hành

PAGE \* MERGEFORMAT 14 | Page


IT007– Hệ điều hành

NỘI DUNG BÀI LÀM

Hãy thiết kế một chương trình C để tạo ra một giao diện shell. Giao diện này cho phép
người dùng nhập các lệnh và sau đó thực thi từng lệnh trong một quy trình riêng biệt.
Điểm đặc biệt là chương trình này sẽ hỗ trợ việc chuyển hướng đầu vào và đầu ra,
cũng như sử dụng pipes như một cách để truyền thông tin giữa các cặp lệnh.

Giao diện shell cung cấp cho người dùng lời nhắc, sau đó lệnh được nhập. Mỗi khi
lệnh thực hiện xong, shell sẽ hiện lên dấu nhắc để chạy lệnh khác. Ví dụ dưới đây
minh họa dấu nhắc it007sh> và lệnh của người dùng: echo abc

it007sh> echo abc

Một kỹ thuật để triển khai giao diện shell là trước tiên tiến trình cha đọc những gì
người dùng nhập vào dòng lệnh (trong trường hợp này, là lệnh "echo abc "), sau đó tạo
ra một tiến trình con riêng biệt để thực hiện lệnh đó. Trừ khi được chỉ định khác, tiến
trình cha đợi cho đến khi tiến trình con thoát ra trước khi tiếp tục. Điều này tương tự
về chức năng với việc tạo ra một tiến trình mới như được minh họa dưới đây:

Đoạn chương trình mẫu tạo ra dấu nhắc it007sh>:

#include <stdio.h>

#include <unistd.h>

#define MAX LINE 80 /* The maximum length command */

int main(void) {

char *args[MAX LINE/2 + 1]; /* command line arguments */

int should run = 1; /* flag to determine when to exit program

*/

while (should run) { printf("it007sh>"); fflush(stdout);

PAGE \* MERGEFORMAT 14 | Page


IT007– Hệ điều hành
/**

Do something

*/ }

return 0;

Dựa vào đoạn chương trình trên hãy thực hiện thêm các yêu cầu dưới đây

1. Thực thi command trong tiến trình con

Ví dụ: khi thực hiện

it007sh> echo abc4

Kết quả sẽ hiển thị nội dung của file abc.txt, kết thúc dòng lệnh sẽ hiển thị dấu
nhắc it007sh> để người dùng nhập lệnh tiếp theo. Lưu ý rằng trong thời thực thi
của lệnh echo abc, không cho người dùng nhập command mới.

Gợi ý: Figure 1

Bài làm

2. Tạo tính năng sử dụng lại câu lệnh gần đây nhất

Cung cấp History Feature, cho phép người dùng thực thi lệnh gần đây nhất
bằng cách nhập ‘mũi tên lên’ và nhấn enter.
Ví dụ: lịch sử command

echo abc

ls -l

pwd

PAGE \* MERGEFORMAT 14 | Page


IT007– Hệ điều hành
khi sử dụng mũi tên đi (↑), shell sẽ lần lượt hiện lại các lệnh đã sử dụng trong quá
khứ theo thời gian gần đây nhất. Nhấn phím Enter để thực thi lệnh.

Bài làm

Phần 1: Khai báo các biến và hàm add_to_history

- if (history_count < HISTORY_SIZE) : Kiểm tra xem còn chỗ trống trong lịch sử
để lưu lệnh mới hay không.

+ strcpy(history[history_count++], command);: Nếu còn chỗ trống trong lịch sử,


lệnh command sẽ được sao chép (bằng hàm strcpy) vào phần tử tiếp theo trong mảng
lịch sử history, và history_count sẽ được tăng lên một để đếm số lượng lệnh trong lịch
sử. Ngược lại, nếu lịch sử đã đầy (history_count đạt đến HISTORY_SIZE)

+ int i; for (i = 0; i < HISTORY_SIZE - 1; ++i) { strcpy(history[i], history[i + 1]); }:


Phần này thực hiện dịch chuyển các lệnh cũ trong lịch sử lên một cấp để làm chỗ cho
lệnh mới. Nó duyệt qua mảng lịch sử và sao chép lệnh tại vị trí i+1 vào vị trí i, làm cho
mọi lệnh trừ lệnh cuối cùng (tại HISTORY_SIZE - 1) đều dịch sang trái một vị trí.

strcpy(history[HISTORY_SIZE - 1], command);: Cuối cùng, lệnh command mới nhất


được người dùng nhập sẽ được sao chép vào phần tử cuối cùng của mảng lịch sử
history, đó là vị trí được giữ để lưu lệnh mới nhất

PAGE \* MERGEFORMAT 14 | Page


IT007– Hệ điều hành

Phần 2: Hàm main của chương trình

3. Chuyển hướng vào ra

PAGE \* MERGEFORMAT 14 | Page


IT007– Hệ điều hành
Hỗ trợ các toán tử chuyển hướng '>' và '<', trong đó '>' chuyển hướng đầu
ra của lệnh sang một tệp và '<' chuyển hướng đầu vào của lệnh từ một tệp.
Ví dụ: nếu người dùng nhập it007sh>ls > out.txt5
Đầu ra từ lệnh ls sẽ được chuyển hướng đến tệp out.txt. Tương tự, đầu vào
cũng có thể được chuyển hướng. Ví dụ, nếu người dùng nhập it007sh>sort <
in.txt. Tệp in.txt sẽ đóng vai trò là đầu vào cho lệnh sắp xếp.

Gợi ý: sử dụng hàm dup2()

Bài làm

4. Giao tiếp sử dụng cơ chế đường ống

Cho phép đầu ra của một lệnh đóng vai trò là đầu vào cho lệnh khác bằng
cách sử dụng một đường ống. Ví dụ: it007sh>ls -l | less . Có đầu ra của lệnh
ls -l đóng vai trò là đầu vào cho lệnh less
Gợi ý: sử dụng hàm pipe() và dup2()

Bài làm

PAGE \* MERGEFORMAT 14 | Page


IT007– Hệ điều hành
5. Kết thúc lệnh đang thực thi

Ví dụ: khi thực hiện lệnh it007sh>top, kết quả sẽ liên tục hiển thị các
process của hệ thống, khi sử dụng tổ hợp phím Ctrl + C, lệnh thực thi trên
sẽ kết thúc và hiển thị dấu nhắc it007sh> mời người dùng nhập lệnh tiếp
theo.

Bài làm

PAGE \* MERGEFORMAT 14 | Page

You might also like