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>
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">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"><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>