PHẦN THỰC HÀNHVí Dụ 1: Biên dịch chương trình hello.cB: Kết Quả DemoVí Dụ 2: Biên dịch chương trình truyền đối số và in ra các đối số đó2.1: Code chương trìnhA.. Code chương trình//main.
Trang 1TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI TẬP NMHĐHHK1, 2023-2024
Lab 3Nhóm: 01 Tổ: 02
1: Nguyễn Thanh Sơn ( MSSV: 52200287)
Trang 2Mục lục……….
Trang 3A PHẦN THỰC HÀNHVí Dụ 1: Biên dịch chương trình hello.c
B: Kết Quả Demo
Ví Dụ 2: Biên dịch chương trình truyền đối số và in ra (các) đối số đó
2.1: Code chương trìnhA Code chương trình//main.c
int main(int argc, char ** argv) {
printf("so doi so truyen vao: %i\n", argc); // in ra số đối số truyền vàoprintf("gia tri cac doi so: ");
Trang 4int i = 0;
for(int i=0; i < argc; i++) // tạo vòng lặp in ra các đối số truyền vàoprintf("%s\t", argv[i]);
B Kết quả Demo
Ví Dụ 3.1: Sử dụng thư viện tỉnh để biên dịch chương trìnhA Code chương trình
//hello1.c#include<stdio.h>void hello1(int i) {
printf("Hello parameter 1 = %d \n", i); //in ra màn hình tham số 1}
//hello2.c#include<stdio.h>void hello2(int i) {
printf("Hello parameter 2 = %d \n", i); //in ra màn hình tham số 2}
//main.c
Trang 5int main(int argc, char ** argv) {
int i = atoi(argv[1]); // ép kiểu char về int bằng hàm atoiint k = atoi(argv[2]); // ép kiểu char về int bằng hàm atoihello1(i); // gọi hàm hello1
hello2(k); // gọi hàm hello2}
B Kết quả demo
Ví dụ 3.2: Sử dụng thư viện động để biên dịch chương trình
//hello1.c#include<stdio.h>void hello1(int i) {
printf("Hello parameter 1 = %d \n", i); //in ra màn hình tham số 1}
//hello2.c#include<stdio.h>void hello2(int i) {
Trang 6printf("Hello parameter 2 = %d \n", i); //in ra màn hình tham số 2}
int main(int argc, char ** argv) {
int i = atoi(argv[1]); // ép kiểu char về int bằng hàm atoiint k = atoi(argv[2]); // ép kiểu char về int bằng hàm atoihello1(i); // gọi hàm hello1
hello2(k); // gọi hàm hello2}
Ví dụ 4: Tạo tiến trìnhA Code chương trình
#include<stdio.h>#include<unistd.h>int main() {
printf("current process ID: %d\n", getpid());printf("Parent process ID: %d\n", getppid());return 0;
}
Trang 7#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;}
#include<stdio.h>#include<unistd.h>int main() {
int pid, pid1;
Trang 8if( (pid = fork()) == 0) {printf(" -B -\n");
printf("This is B: ID = %d\n", getpid());printf("Parent: A ID = %d\n", getppid());printf(" -end B -\n");
} else if(pid > 0) {
if( (pid1 = fork()) == 0) {printf(" -C -\n");
printf("This is C: ID = %d\n", getpid());printf("Parent: A ID = %d\n", getppid());printf(" -end C -\n");
return 0;}
B Kết quả demo
Trang 10int main(int argc, char ** argv) {
int a = atoi(argv[1]); // ép kiểu char về int thông qua ham atoi
if(argc >2) // kiem tra dieu kien doi so vao thoa man =2 hay khong
printf("Doi so truyen vao qua nhieu \n");
else if(a<=0) //kiểm tra điều kiện a có thỏa mản <= 0 hay không
printf("Doi so nhap vao khong phai la so nguyen duong\n"); else {
int sum =0;
for(int i=0; i<=a; i++) // chạy vòng lặp để tính tổng từ 1 tới n
sum = sum + i;printf("S = %i\n",sum); }
return 0;}
B: Kết Quả Demo:
a 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.
Trang 11b Báo lỗi nếu có nhiều hơn 2 đối số (là main.out và n).
Bài 2: Viết chương trình nhận một đối số từ môi trường là số phần tử trong mảng, nhập giá trị của tất cả các phần tử trong mảng, xuất tổng của mảng đó ra khỏi màn hình.
a Báo lỗi nếu n không phải là số nguyên dương
b Báo lỗi nếu khác n+2 đối số (là ex2.out, n và n phần tử trong mảng).
A: Code Chương Trình:
int main(int argc, char ** argv) {
int n = atoi(argv[1]); //ép kiểu char về int thông qua hàm atoi
Trang 12double check = atof(argv[1]); //ép kiểu char về double thông qua hàm atof
int arr[n]; //khai báo mảng arr gồm n phần tử
if(n <= 0 || n != check) //kiểm tra điều kiện n có là số nguyên dương không
printf("So luong phan tu phai la so nguyen duong\n");else if( argc != n + 2) //kiểm tra điều kiện đối số vào thỏa mản = n+2
printf("Doi so truyen vao khong hop le\n");else {
int i; // khởi tạo i
double sum = 0; // khởi tạo sum
for(i = 0; i < n; i++) { // chạy vòng lặp để:
arr[i] = atof(argv[i+2]); // lưu giá trị vào mảng
sum += atof(argv[i+2]); // tính tổng các phần tử trong mảng
printf("Tong cac phan tu trong mang: %f\n", sum);}
return 0;}
B: Kết Quả Demo:
a Báo lỗi nếu n không phải là số nguyên dương
Trang 13b Báo lỗi nếu khác n+2 đối số (là ex2.out, n và n phần tử trong mảng).
Ví Dụ 3: Tạo tệp lib1.c tính tổng các số từ 1 đến n; lib2.c có hàm giai thừa có giá trị nguyên từ 1 đến n, trong đó n là đối số đầu vào, n là số nguyên dương.
1) Tạo thư viện liên kết tĩnh libs.s; Tạo một tệp select.c với chức năng chính Trong hàm main, nếu argv [1] = 1 thực hiện tính tổng các số từ 1 đến argv [2] thì hàm còn lại thực hiện tính giai thừa các số từ 1 đến argv [2]
2) Tạo thư viện liên kết động libd.d; Tạo file selectd.c với hàm main Trong hàm main, argv [1] = 1 thực hiện tính tổng các số từ 1 đến argv [2], hàm còn lại thực hiện phân tích nhân tử các số từ 1 đến argv [2] – nhớ sử dụng liên kết thư viện.
a Báo lỗi nếu số tham số truyền vào khác 3
b Báo lỗi nếu n nhập vào không phải là số nguyên dươngA: Code chương trình
#include<stdio.h>#include<stdlib.h>
Trang 14int lib1(int n) {int i = 0, sum = 0;
for(i; i <= n; i++) // tạo vòng lặp để tính tổngsum += i;
printf("Tong cac so tu 1 den %d la: %d\n", n, sum);return 0;
}//lib2.c
Trang 15int main(int agrc, char ** agrv) {int n1 = atoi(agrv[1]);int n2 = atoi(agrv[2]);
if(agrc != 3) // kiểm tra số tham số có khác 3 khôngprintf("So tham so khong hop le\n");
else if(n1 <= 0 || n2 <= 0 || n1 != atof(agrv[1]) || n2 != atof(agrv[2]))// kiểm tra n có phải là số nguyên dương không
printf("n phai la so nguyen duong\n");else if(n1 == 1) { // kiểm tra argv[1] có = 1 không
lib1(n2);lib2(n2);} else {
return 0;}
B: Kết quả demo
Trang 16a Báo lỗi nếu số tham số truyền vào khác 3
b Báo lỗi nếu n nhập vào không phải là số nguyên dương
Ví Dụ 4:
A: Code chương trình
#include <stdio.h>#include <unistd.h>
int main(){
pid_t pid1, pid2, pid3, pid4, pid5;
Trang 17pid1 = fork();if(pid1 < 0){
printf("Fork error! No C created!\n");} else if(pid1 == 0){
printf("Hello from C\n");printf("C ID is %d\n", getpid());
printf("My parent A PID is %d\n", getppid());pid2 = fork();
if(pid2 < 0){
printf("Fork error! No H created\n");} else if(pid2 == 0){
printf("Hello from H\n");printf("H ID is %d\n", getpid());
printf("My parent C PID is %d\n", getppid());}
else {sleep(3);
printf("Hello from C\n");printf("C ID is %d\n", getpid());printf("My child H PID is %d\n", pid2);}
}else{
Trang 18printf("Hello from A\n");printf("A ID is %d\n", getpid());printf("My child C PID is %d\n", pid1);pid3 = fork();
if(pid3 < 0){
printf("Fork error! No B created\n");} else if(pid3 == 0){
printf("Hello from B\n");printf("B ID is %d\n", getpid());
printf("My parent A PID is %d\n", getppid());pid4 = fork();
if(pid4 <0){
printf("Fork error! No D created\n");} else if(pid4 == 0){
printf("Hello from D\n");printf("D ID is %d\n", getpid());
printf("My parent B PID is %d\n", getppid());}
else {sleep(3);
printf("Hello from B\n");printf("B ID is %d\n", getpid());
Trang 19printf("My child D PID is %d\n", pid4);pid5 = fork();
} else {sleep(3);
printf("Hello from B\n");printf("B ID is %d\n", getpid());printf("My parent E PID is %d\n", pid5);}
}}else {
printf("Hello from A\n");printf("A ID is %d\n", getpid());printf("My parent B PID is %d\n", pid3);}
Trang 20B: Kết quả demo
Trang 21KẾT LUẬN
Sau khi học và hoàn thành phần lab 3 nhóm thu được kết sau:- Em học được cách tìm ID cha và con của process- Em học được cách sử thư viện động
- Em học được cách sử thư viện tĩnh
Chú ý bài làm giống nhau sẽ bị trừ điểm.
Trang 22KẾT QUẢ LÀM VIỆC CÁC THÀNH VIÊN TRONG NHÓM
Nguyễn Văn A12345678
CHÚ THÍCH:TN: TRƯỞNG NHÓMTV: THÀNH VIÊN
HT: MỨC ĐỘ HOÀN THÀNH CÔNG VIỆC ĐƯỢC GIAO