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 2CHILDREN | 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 4e _ 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 5printf("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 6e _ #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 7e 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 9e 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 12Wetory 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 13e #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 14close(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 15strcpy(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 16H
;„ MAP SHARED, NS, 8);
16
Trang 17Giai 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 18e _ #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