ĐẠ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 -