Tải bản đầy đủ (.pdf) (23 trang)

báo cáo bài tập nhập môn hệ điều hành lab 3 3

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.81 MB, 23 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN </b>

<b>BÁO CÁO BÀI TẬP NMHĐH</b>

<b>HK2, 2022-2023</b>

<b>Lab 3</b>

1: Ngơ Xn Bình ( MSSV: 52200270)

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<small>B). TẠOTHƯVI NỆĐ NGỘLIBD.D; TẠOT PỆSELECTD.CV IỚHÀM MAIN. TRONG HÀM MAIN NÊỐU ARGV, [1] = 1, TH CỰHI NỆTÍNHT NGỔTỪ 1 ĐÊỐNARGV[2], NGƯỢCL IẠTH CỰHI NỆTÍNH GIAI TH AỪTỪ 1 ĐÊỐNARGV[2] - NHỚSỬD NGỤLIÊN KÊỐT THƯVI NỆ....12</small>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

A. PHẦẦN TH C HÀNH<b>Ự</b>

Ví D 1: <b>ụ</b> Biên d ch ch<b>ịươ</b> ng trình đầầu tiênA: Code Ch<b>ươ</b> ng Trình

// hello.c#include <stdio.h>void hello(){

printf("Hello world...! \n");}

// main.c int main()

hello(); return 0;}

B: Kêết Qu Demo<b>ả</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

printf("\n");}

B: Kêết Qu Demo<b>ả</b>

Ví D 3: <b>ụỨ</b> ng d ng th vi n tĩnh và th vi n đ ng <b>ụư ệư ệộ</b>

A: Code Ch<b>ươ</b> ng Trình//hello1.c

#include <stdio.h>]

void hello1(int i){

printf("Hello parameter 1 = %d \n", i);}

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

//hello2.c#include <stdio.h>void hello2(int i){

printf("Hello parameter 2 = %d \n", i);}

Tạo thư viên tĩnh libh.a từ 2 file hello1.c và hello2.c

Tạo thư viện động libd.a từ 2 file hello1.c và hello2.c

B: Kêết Qu Demo<b>ả</b>

Chạy bằng thư viên tĩnh

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Chạy bằng thư viên động

Ví D 4: <b>ụ</b> Tiêến trình căn b n<b>ả</b>

A: Code Ch<b>ươ</b> ng Trình//p1.c

#include <stdio.h>#include <unistd.h>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

int main(){

printf("current process ID: %d\n", getpid()); printf("parent process ID: %d\n", getppid()); return 0;

#include <stdio.h>#include <unistd.h>int main()

pid_t pid;

if((pid = fork()) == 0) {

printf("child process: child ID = %d\n", getpid()); printf("my parent id: parent ID = %d\n", getppid()); }

else if (pid > 0) {

printf("parent process: parent ID = %d\n", getpid()); printf("child ID = %d\n", pid);

} else {

printf("fork error!\n"); }

return 0;}

B: Kêết qu Demo<b>ả</b>

Chạy thử p1.c

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

#include <stdio.h>

int main() { int n;

int sum = 0; // Khởi tạo biến sum để lưu tổng

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

// Nhập giá trị của n từ người dùng

printf("Nhập vào một số nguyên dương n: "); if (scanf("%d", &n) != 1 || n <= 0) {

// Xử lý ngoại lệ: Nếu người dùng nhập không phải số nguyên dương // hoặc số âm, thì hiển thị thơng báo và kết thúc chương trình printf("Vui lịng nhập một số nguyên dương.\n");

return 1; // Kết thúc chương trình với mã lỗi 1 }

// Tính tổng sử dụng vịng lặp for (int i = 1; i <= n; i++) {

sum += i; // Cộng giá trị i vào tổng }

// Hiển thị kết quả

printf("Tổng của %d số nguyên dương đầu tiên là: %d\n", n, sum);

return 0; // Kết thúc chương trình thành cơng}

B: Kêết Qu Demo:<b>ả</b>

Báo lỗi nếu lời gọi có đối số khơng phải là một số nguyên dương.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

BÀI : Viêết ch<i>2</i> <b>ươ</b> ng trình nh p sốế l<b>ậượ</b> ng phầần t c a m ng t biêến mối <b>ử ủảừ</b>

tr ng, sau đó nh p giá tr c a các phầần t trong m ng và tính t ng

c a các phầần t đó.<b>ủử</b>

A: Code Ch<b>ươ</b> ng Trình://bai2.c

#include <stdio.h>#include <stdlib.h>

int num_elements = atoi(env_var); // Chuyển đổi giá trị từ biến môi trường thành số nguyên

// Kiểm tra xem giá trị của num_elements có hợp lệ hay không if (num_elements <= 0) {

printf("Giá trị của NUM_ELEMENTS không hợp lệ.\n");

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

return 1; // Kết thúc chương trình với mã lỗi 1 nếu giá trị khơng hợp lệ }

int sum = 0; int element;

// Nhập giá trị của các phần tử và tính tổng

printf("Nhập giá trị cho %d phần tử:\n", num_elements); for (int i = 0; i < num_elements; i++) {

printf("Phần tử %d: ", i + 1); if (scanf("%d", &element) != 1) {

// Xử lý ngoại lệ: Nếu nhập không phải số nguyên, hiển thị thông báo lỗi và kết thúc

printf("Lỗi: Vui lòng nhập số nguyên.\n"); return 1; // Kết thúc chương trình với mã lỗi 1 }

sum += element; }

// Hiển thị tổng

printf("Tổng của các phần tử là: %d\n", sum);

return 0; // Kết thúc chương trình thành cơng}

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

a. Báo lỗi nếu không cài biến môi trường

b. Báo lỗi nếu lời gọi có đối số khơng phải là một số nguyên dương.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

BÀI : T o t p lib1.c đ tính t ng các sốế t 1 đêến n; t p lib2.c ch a <i>3</i><b>ạ ệểổừệứ</b>

hàm giai th a cho giá tr nguyên t 1 đêến n, trong đó n là đốếi sốế đầầu <b>ừịừ</b>

vào và n là m t sốế nguyên d<b>ộươ</b>ng.

A). T o th vi n tĩnh libs.s; T o t p selects.c v i hàm main. Trong

hàm main, nêếu argv[1] = 1, th c hi n tính t ng t 1 đêến argv[2], <b>ựệổừ</b>

ng c l i th c hi n tính giai th a t 1 đêến argv[2] - nh s d ng liên

kêết th vi n.<b>ư ệ</b>

B). T o th vi n đ ng libd.d; T o t p selectd.c v i hàm main. Trong

hàm main, nêếu argv[1] = 1, th c hi n tính t ng t 1 đêến argv[2], <b>ựệổừ</b>

ng c l i th c hi n tính giai th a t 1 đêến argv[2] - nh s d ng liên

kêết th vi n.<b>ư ệ</b>

A: Code Ch<b>ươ</b> ng Trình

a) <small> Tạo tệp </small><b>lib1.c</b> để tính tổng từ 1 đến n:// lib1.c

#include <stdio.h>

int calculate_sum(int n) { if (n < 1) {

printf("Lỗi: n phải là số nguyên dương.\n"); return -1; // Kết thúc chương trình với mã lỗi -1 }

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

if (n < 1) {

printf("Lỗi: n phải là số nguyên dương.\n"); return -1; // Kết thúc chương trình với mã lỗi -1 }

c) Tạo thư viện tĩnh và chương trình selects.c:// selects.c

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

}

int option = atoi(argv[1]); int n = atoi(argv[2]);

if (option != 1 && option != 2) {

printf("Lựa chọn khơng hợp lệ. Sử dụng 1 để tính tổng hoặc 2 để tínhgiai thừa.\n");

return 1; }

if (option == 1) {

int sum = calculate_sum(n); if (sum != -1) {

printf("Tổng từ 1 đến %d là: %d\n", n, sum); }

d) Tạo chương trình selectd.c để sử dụng thư viện động:// selectd.c

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

printf("Sử dụng: %s [1|2] [n]\n", argv[0]); return 1;

}

int option = atoi(argv[1]); int n = atoi(argv[2]);

if (option != 1 && option != 2) {

printf("Lựa chọn không hợp lệ. Sử dụng 1 để tính tổng hoặc 2 để tínhgiai thừa.\n");

return 1; }

void *lib; // Con trỏ thư viện động

int (*calculate)(int); // Con trỏ hàm tính tổng hoặc giai thừa

// Mở thư viện động libd.d

lib = dlopen("./libd.d", RTLD_LAZY);

if (!lib) {

printf("Lỗi khi mở thư viện động.\n"); return 1;

}

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

// Liên kết động hàm tính tổng hoặc giai thừa if (option == 1) {

calculate = dlsym(lib, "calculate_sum"); } else {

calculate = dlsym(lib, "calculate_factorial"); }

if (!calculate) {

printf("Lỗi khi liên kết động hàm.\n"); dlclose(lib); // Đóng thư viện động return 1;

}

// Gọi hàm tính tổng hoặc giai thừa từ thư viện động int result = calculate(n);

if (result != -1) { if (option == 1) {

printf("Tổng từ 1 đến %d là: %d\n", n, result); } else {

printf("Giai thừa của %d là: %d\n", n, result); }

}

dlclose(lib); // Đóng thư viện động

return 0;

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

f) Biên dịch lib1.c và lib2.c thành thư viên động:

g) Biên dịch selects.c

h) Biên dịch selectd.c

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

B: Kêết Qu Demo:<b>ả</b>

<small>a)</small> Kết quả chạy thử của selects.c với thư viên tĩnh libs.s

<b>- Một số trường hợp phát sinh lỗi </b>

b) Kết quả chạy thử của selectd.c với thư viện động libd.d

<b>- Một số trường hợp phát sinh lỗi</b>

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

BÀI 4: T o m t tiêến trình trong cầy th m c sau tên in ghi chú, ID tiêến <b>ạộư ụ</b>

trình, ID c a tiêến trình cha:<b>ủ</b>

A: Code Ch<b>ươ</b> ng Trình//processtree.c#include <stdio.h>#include <stdlib.h>#include <unistd.h>

int main() { // Process A

printf("Process A - PID: %d, PID cha: %d\n", getpid(), getppid()); // Tạo Process B

if (fork() == 0) { // Process B

printf("Process B - PID: %d, PID cha: %d\n", getpid(), getppid());

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

// Tạo Process D if (fork() == 0) { // Process D

printf("Process D - PID: %d, PID cha: %d\n", getpid(), getppid()); exit(0);

}

// Tạo Process E if (fork() == 0) { // Process E

printf("Process E - PID: %d, PID cha: %d\n", getpid(), getppid()); exit(0);

} exit(0); }

// Tạo Process C if (fork() == 0) { // Process C

printf("Process C - PID: %d, PID cha: %d\n", getpid(), getppid());

// Tạo Process H if (fork() == 0) { // Process H

printf("Process H - PID: %d, PID cha: %d\n", getpid(), getppid()); exit(0);

} exit(0); }

sleep(2); // Sleep để cho các tiến trình hồn thành return 0;

}

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

C. KẾẾT LU N <b>Ậ</b>

<b>Sau khi học và hồn thành phần lab 3 nhóm thu được kết sau:</b>

<b>- Biết được cách biên dịch và chạy chương trình C cơ bản trên hệ điều hành linux.</b>

<b>- Biết được cách ứng dụng thư viên tĩnh và động vào trong các chương trình C.</b>

<b>- Liên tục thực hành và thuần thục cách điều khiển command-line trên hệ điều hành linux.</b>

<b>- Hiểu được cơ chế hoạt động của tiến trình trong hệ điều hành</b>

</div>

×