1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo thực hành môn hệ Điều hành

36 1 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Định dạng
Số trang 36
Dung lượng 4,47 MB

Nội dung

e #include : Thu vién chuan C, cung cáp các hàm liên quan đến việc quán ly bộ nhớ, chuyền đổi kiêu dữ liệu, và các hàm khác... e _ #include : Thư viện POSIX, cung cấp các hàm liên quan đ

Trang 1

Họ và tên sinh viên làm bài: Nguyễn Hạc Phong - 22521087

Đặng Đức Phát - 22521064 Phan Nguyễn Anh Tuyèn - 22521635 Nguyễn Hoàng Trọng Sơn - 22521252

Trang 2

CHILDREN | PID = 189 | PPID = 188

Giai thich code:

Trang 3

#include <stdio.h>: Thư viện này cung cap các hàm nhập/xuát

#include <stdlib.h>: Thư viện này cung cấp các hàm như exit(), malloc(), ñree(), v.v

#include <unistd.h>: Thư viện này cung cấp các hàm như fork(), getpid(), getppid(),

V.V

#include <sys/wait.h>: Thư viện này cung cấp hàm waitQ

#include <sys/types.h>: Thư viện này cung cáp kiểu dữ liệu — pid t

_— pid tpid;: Khai báo một biến pid kiêu _ pid t đề lưu trữ ID của tiến trình

pid = fork();: Goi ham fork() dé tao mét tién trình con ID của tiên trình con sẽ được luu vao bién pid

if (pid > 0): Kiém tra xem tién trình hiện tại có phái là tiền trình cha không Nếu pid

> 0, chúng ta đang ở trong tiền trình cha

printf("PARENTS | PID = %ld | PPID = %ld\n", (long)getpid(), (long)getppid());: In

ra ID của tiên trình cha và ID của tiến trình ông nội

if (argc > 2) printf("PARENTS | There are %d arguments\n", argc - 1);: Kiêm tra xem

có nhiều hơn 2 đối số được truyền vào không Nếu có, in ra số lượng đổi sé

wait(NULL);: Tiến trình cha chờ tiên trình con kết thúc

if (pid == 0): Kiêm tra xem tiền trình hiện tại có phải là tiến trình con không Néu pid = 0, chúng ta đang ở trong tiền trình con

printf("CHILDREN | PID = %ld | PPID = %ld\n", (long)getpid(), (long)getppid())::

In ra ID của tiến trình con và ID của tiến trình cha

printf("GHILDREN I List of argumenis: \n"):: In ra danh sách các đôi sô được truyèn vào

for (int i = 1; ¡< argc; i++) { printf("%s\n", argv[i]); }: Duyệt qua danh sách các đồi

3

Trang 4

e _ Trong ví dụ này, tiền trình cha có PID là 188 và tiền trình con có PID là 189

e - Sau khi tiến trình con được tạo ra, nó sẽ thực thi đoạn mã lệnh printf("List of arguments: %d\n", argv[i]); Đoạn mã lệnh này sẽ ¡n ra các đối số được truyền vào

cho tiên trình con

e _ Trong ví dụ này, các đôi số được truyền vào cho tiến trình con là "1", "2" và "3",

e - Sau khi inra các đối só, tiến trình con sẽ kết thúc Tiền trình cha sẽ tiếp tục chạy và

in ra thông báo "There are 3 arguments"

e - Sau đó, tiến trình cha cũng sẽ kết thúc

PARENTS | PID = 230 | PPID = 15

PARENTS | There are 3 arguments

PPID of count.sh:

Trang 5

printf("CHILDREN | PID = %ld | PPID = \n", ( )getpid(), ( Jgetppid());

printf("“CHILDREN | List of arguments: \n");

Giai thich code:

e = #include <stdio.h>: Thu vién chuan C, cung cáp các ham nhap/xuat

e #include <stdlib.h>: Thu vién chuan C, cung cáp các hàm liên quan đến việc quán ly

bộ nhớ, chuyền đổi kiêu dữ liệu, và các hàm khác

Trang 6

e _ #include <unistd.h>: Thư viện POSIX, cung cấp các hàm liên quan đến hệ điều hành,

nhu fork(), getpid(), getppidQ), va execl()

e _ #include <sys/waith>: Thư viện POSIX, cung cap ham wait() dé qua trinh cha cho quá trình con kết thúc

e #include <sys/types.h>: Thư viện POSIX, cung cáp các kiêu dữ liệu hệ thống, như pid_t

e int main(int argc, char* argv[]): Ham main với hai tham số: argc (sô lượng đối số

truyền vào chương trình) và argv (máng chứa các đối sô)

e«e _— pid tpid;: Khai báo biến pid kiêu _ pid t để lưu ID của quá trình

e pid = fork();: Goi ham fork() dé tạo quá trình con pid sẽ chứa ID của quá trình con nếu đang ở quá trình cha, và 0 nếu đang ở quá trình con

e if (pid > 0): Kiém tra néu dang 6 qua trinh cha

se printf(PARENTS | PID = %ld | PPID = %ld\n", (long)getpid(), (long)getppid());: In

ra ID cua qua trinh cha va qua trinh 6ng ba (PPID)

e if (argc > 2) printf("PARENTS | There are %d arguments\n", argc - 1);: Nếu có nhiều hon 2 déi $6 duoc truyén vao, in ra $6 long déi sé

e wait(NULL);: Quá trình cha chờ quá trình con két thúc

e if (pid == 0): Kiém tra néu dang 6 qua trinh con

e execl("./count.sh", "./count.sh", "10", NULL);: Thue thi một script shell có tên là count.sh với đôi sô “10”

« _ printf("CHILDREN | PID = %ld 1 PPID = %ld\n", (long)getpid(), (long)getppid());:

In ra ID của quá trình con và quá trình cha

e - printf("GHILDREN | List of arguments: \n");: In ra thông báo “List of arguments:”

efor (int i = 1;i< arge; i++) printf("%swn", argv[i]);: Duy ệt qua các đối số và in ra mỗi đối sô

e _ ©xit(0);: Kết thúc chương trình với mã 0, biểu thị rằng chương trình đã kết thúc mà không có lỗi

Giải thích kết quả:

1 Thông tin tiền trình cha:

Trang 7

e PARENTS | PID = 230 | PPID = 15: Dòng này cho biết tiền trình cha có PID là 230

và tiền trình cha của nó có PID là 15 Thông thường, tiến trình cha của một chương

trình là shell mà từ đó nó được khởi chạy

2 Số lượng đối số:

e PARENTS | There are 3 arguments: Dong này cho biết chương trình được thực thi

với ba đối số, bao gồm tên chương trình

3 Thực thi chương trình:

e Implementing: /count.sh: Dòng này cho biết chương trình đang thực thi tập lệnh

count.sh

4 Đối số truyền cho tập lệnh:

e 123: Dòng này cho biết ba đối số đã được truyền cho tập lệnh count.sh

5 Đầu ra của tiền trình con (néu có):

e _ Đầura của tập lệnh count.sh sẽ được hiên thị ở đây néu nó tạo ra bất kỳ đầu ra nào

Ví dụ 3-3:

:~/c$ /test_system 1 2 3

PARENTS | PID = 68 | PPID = 17

PARENTS | There are 3 arguments

Implementing: /count.sh

PPID of count.sh:

nguyenh+ 72 70 9 20:21 pts/0 00:00:00 grep count.sh

PARENTS | List of arguments:

Trang 8

Giải thích code:

#include <stdio.h>: Thư viện chuan C, cung cáp các hàm nhap/xuat

#include <stdlib.h>: Thu vién chuan C, cung cấp các hàm liên quan đến việc quản lý

bộ nhớ, chuyền đổi kiêu dữ liệu, và các hàm khác

#include <unistd.h>: Thư viện POSIX, cung cấp các hàm liên quan đến hệ điều hành,

nhu getpid(), getppid()

#include <sys/wait.h>: Thư viện POSIX, cung cap ham wait() dé qua trinh cha cho quá trình con kết thúc

#include <sys/types.h>: Thư viện POSIX, cung cáp các kiêu dữ liệu hệ thông, như

_ pid t

int main(int argc, char” argv[]): Hàm main với hai tham só: argc (số lượng đối số

truyền vào chương trình) và arev (máng chứa các đối $6)

printf("PARENTS | PID = %ld | PPID = %ld\n", (long)getpid(), (long)getppid(});: In

ra ID của quá trình hiện tại và quá trình cha.

Trang 9

e if (argc > 2) printf("PARENTS | There are %d arguments\n", argc - 1);: Nếu có nhiều hon 2 déi $6 duoc truyén vao, in ra $6 long déi sé

e _ system("./count.sh 10");: Thực thi một script shell có tên là count.sh với đói số “10” bang cach sir dung ham system()

se - printf("PARENTS | List of arguments: \n");: In ra thong bao “List of arguments:”

e for (int i = 1; i< argc; i++) printf("%s\n", argv[i]);: Duyệt qua các đối số và in ra mỗi đối sô

e _ ©xit(0);: Kết thúc chương trình với mã 0, biểu thị rằng chương trình đã kết thúc mà không có lỗi

Giải thích kết quả:

1 Thông tin tiến trình:

e _ Dòng đầu tiên in ra thông tin tiền trình của tiến trình cha:

e PID =68: ID của tiến trình cha là 68

e PPID = 17: ID cua tiến trình cha của tiến trình cha (tức là tiến trình ông) là 17

2 Số lượng đối số:

e - Dòng thứ hai in ra số lượng đối số được truyền vào chương trình:

e There are 3 arguments: Có 3 đôi số được truyền vào chương trình, bao gôm tên

chương trình và 2 đôi số 1 và 2

3 Thực thi lệnh shell:

e _ Dòng thứ ba in ra thông tin về việc thực thi lệnh shell /count.sh 10:

e Executing command: /count.sh 10: Lénh shell /count.sh 10 được thực thị

4 Danh sách đối số:

e - Dòng thứ tư in ra danh sách các đôi số được truyền vào chương trình:

List of arguments: : Danh sách các đối số được in ra

e1: Đối số thứ nhát là 1

Trang 11

= mmap(9, » PROT_READ | PROT_WRITE, MAP_SHARED, @);

strcpy(ptr, “Hello Process B");

while (strncmp(ptr, “Hello Process B", 15

Trang 12

Wetory updated: Heo Drocess |

Giải thích:

test_shm_A

e = #include <stdio.h>: Thu vién chuan C, cung cáp các ham nhap/xuat

e #include <stdlib.h>: Thư viện chuân Ơ, cung cấp các hàm liên quan đến việc quán lý

bộ nhớ, chuyền đổi kiêu dữ liệu, và các hàm khác

e _ #include <string.h>: Thư viện chuân ©, cung cáp các hàm xử lý chuỗi

12

Trang 13

e #include <fentl.h>: Thy vign POSIX, cung cấp các hàm liên quan đến việc mở và quan ly tap tin

e _ #include <sys/shm.h>: Thư viện POSIX, cung cấp các hàm liên quan đến việc quán

e _ int main: Hàm main không có tham sé

e _ constint SIZE =4096;: Khai báo kích thước của đối tượng bộ nhớ chia sẻ là 4096

byte

e const char *name = "0S":: Khai báo tên của đối tượng bộ nhớ chia sẻ là “OS”

e int fd;: Khai bao bién fd để lưu tập tin mô tả của đôi tượng bộ nhớ chia sẻ

e char "ptr;: Khai báo con trỏ ptr đề trỏ đến đối tượng bộ nhớ chia sẻ

e fd=shm_open(name, O_CREAT IO_RDWR,0666);: Mở hoặc tạo một đối tượng bộ

nhớ chia sẻ với tên là '*OS”, quyền đọc và ghi, và quyên truy cập là 0666

e _ fruncate(#l, SIZE);: Thay đôi kích thước của đôi tượng bộ nhớ chia sẻ thành 4096

byte

e ptr =mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: Anh

xạ đối tượng bộ nhớ chia sẻ vào không gian bộ nhớ của quá trình

e —strcpy(ptr, "Hello Process B");: Ghi chudi “Hello Process B” vao b6 nhé chia sé

e while (strncmp(ptr, "Hello Process B", 15) == 0): Cho cho dén khi chudi trong bộ nhớ chia sẻ không còn 14 “Hello Process B”

« = printf("Waiting Process B update shared memory\n");: In ra thong bao “Waiting Process B update shared memory”

e sleep(1);: Ding qua trinh trong 1 giay

e —printf("Memory updated: %s\n", (char *)ptr);: In ra chuỗi mới từ bộ nhớ chia sẻ

« munmap(ptr, SIZE);: Hủy ánh xạ bộ nhớ

13

Trang 14

close(fd);: Đóng tập tin mô tá của đối tượng bộ nhớ chia sẻ

return 0;: Kết thúc chương trình với mã 0, biêu thị rằng chương trình đã kết thúc mà

không có lỗi

test shm_B

#include <stdio.h>: Thư viện chuan C, cung cáp các hàm nhap/xuat

#include <stdlib.h>: Thu vién chuan C, cung cấp các hàm liên quan đến việc quản lý

bộ nhớ, chuyền đổi kiêu dữ liệu, và các hàm khác

#include <string.h>: Thư viện chuẩn ©, cung cap các hàm xử lý chuỗi

#include <fentl.h>: Thư viện POSIX, cung cáp các hàm liên quan đến việc mở và

quan ly tap tin

#include <sys/shm.h>: Thư viện POSIX, cung cấp các hàm liên quan đến việc quản

int main(): Hàm main không có tham số

const int SIZE = 4096;: Khai báo kích thước của đối tượng bộ nhớ chia sẻ là 4096

byte

const char *name = "OS":: Khai bao tén cua déi trong b6 nho chia sé la “OS” int fd;: Khai báo biến £d đề lưu tập tin mô tá của đối tượng bộ nhớ chia sẻ

char *ptr;: Khai bao con trỏ ptr đề trỏ đến đối tượng bộ nhớ chia sẻ

fd = shm_open(name, O_RDWR,0666);: Mở một đối tượng bộ nhớ chia sẻ với tên là

“OS”, quyền đọc và ghi, và quyèn truy cập là 0666

ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: Anh

xạ đối tượng bộ nhớ chia sẻ vào không gian bộ nhớ của quá trình

pmnff("Read shared memory: ”);: In ra thông báo “Read shared memory”

printf("%s\n",(char *)ptr);: In ra chuỗi từ bộ nhớ chia sẻ

14

Trang 15

strcpy(ptr, "Hello Process A");: Cập nhật bộ nhớ chia sẻ với chuỗi “Hello Process A” printf("Shared memory updated: %s\n", ptr);: In ra chuỗi mới từ bộ nhớ chia sẻ sleep(5);: Dừng quá trình trong 5 giây

munmap(ptr, SIZE);: Hủy ánh xạ bộ nhớ

close(fd);: Đóng tập tin mô tá của đối tượng bộ nhớ chia sẻ

shm unlink(name);: Xóa đối tượng bộ nhớ chia sẻ

return 0;: Kết thúc chương trình với mã 0, biêu thị rằng chương trình đã kết thúc mà không có lôi

._ Viết chương trình time.c thực hiện đo thời gian thực thi của một lệnh shell

Chương trình sẽ được chạy với cú pháp "./time <command>" với

<command> là lệnh shell muốn đo thời gian thực thi

Ví dụ:

$ /time l8

time

time

Thởi gian thực thi: 0.25422

Gợi ý: Tiến trình cha gọi hàm fork() tạo ra tiến trình con rồi waitQ Tiền trình con gọi hàm gettimeofday() đề lây mốc thời gian trước khi thực thi lệnh shell, sau

đó sử dụng hàm execl(Q đề thực thi lệnh Sau khi tiến trình con kết thúc, tiến trình cha tiếp tục gọi hàm gettimeifday() một lần nữa đề lầy mốc thời gian sau khi thực thi lệnh shell và tính toán

Trả lời:

15

Trang 16

H

;„ MAP SHARED, NS, 8);

16

Trang 17

Giai thich cach lam:

e #include <stdio.h>: Thu vién chuan C, cung cap cac ham nhap/xuat

e _ #include <stdlib.h>: Thư viện chuân Ơ, cung cấp các hàm liên quan đến việc quản lý

bộ nhớ, chuyền đổi kiêu dữ liệu, và các hàm khác

e _ #include <string.h>: Thư viện chuân ©, cung cáp các hàm xử lý chuỗi

° #include <fentl.h>: Thư viện POSIX, cung cấp các hàm liên quan đến việc mở và quan ly tap tin

17

Trang 18

e _ #include <sys/shm.h>: Thư viện POSIX, cung cấp các hàm liên quan đến việc quán

lý bộ nhớ chia sẻ

e _ #include <sys/stat.h>: Thư viện POSIX, cung cáp các hàm và kiêu dữ liệu liên quan đến thông tin ve tập tin

e _ #include <unistd.h>: Thư viện POSIX, cung cấp các hàm liên quan đến hệ điều hành,

nhu fork(), getpid(), getppidQ), va execl()

e #include <sys4mman.h>: Thu vién POSIX, cung cấp các hàm liên quan đến việc ánh

e _ int main(int argc, char *argv[]): Hàm main với hai tham só: argc (sô lượng đối số

truyền vào chương trình) và argv (máng chứa các đối sô)

e pid_t pid;: Khai bao bién pid kiéu pid t để lưu ID của quá trình

e int status;: Khai bao bién status dé lưu trạng thái kết thúc của quá trình con

e if (argc< 2) { fprintf(stderr, "Usage: %s <command>w"",argv[0]); return 1; }: Kiêm tra xem có đủ đối số được truyền vào chương trình hay không Nêu không, in ra cách

Sử dụng chương trình và kết thúc chương trình với mã lỗi 1

e _ constint SIZE =4096;: Khai báo kích thước của đối tượng bộ nhớ chia sẻ là 4096

Ngày đăng: 04/12/2024, 17:45

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN