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ĐH
HK1, 2023-2024 Lab 3Nhóm: 01 Tổ: 02
1: Nguyễn Thanh Sơn ( MSSV: 52200287)
Trang 2Mục lục
……….
Trang 3int 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 5int main(int argc, char ** argv) {
int i = atoi(argv[1]); // ép kiểu char về int bằng hàm atoi
int k = atoi(argv[2]); // ép kiểu char về int bằng hàm atoi
hello1(i); // gọi hàm hello1
hello2(k); // gọi hàm hello2
Trang 6printf("Hello parameter 2 = %d \n", i); //in ra màn hình tham số 2}
//main.c
#include<stdio.h>
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
printf("current process ID: %d\n", getpid());
printf("Parent process ID: %d\n", getppid());
return 0;
}
Trang 7printf("parent process: parent ID = %d\n", getpid());printf("child id = %d\n", pid);
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");
Trang 10B PHẦN BÀI TẬPBÀI 1: Viết chương trình sau cho khi truyền đối số n vào thì xuất ra tổng S = 1 + 2 + … + n
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.
b Báo lỗi nếu có nhiều hơn 2 đối số (là main.out và n).
A: Code Chương Trình:
Chúy ý: code phải được giải thích để thể hiện hiểu rõ chương trình mình biết
#include <stdio.h>
#include <stdlib.h>
int 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");
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:
#include<stdio.h>
#include<stdlib.h>
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
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ương
A: Code chương trình
//lib1.c
#include<stdio.h>
#include<stdlib.h>
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ông
printf("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
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
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);}
Trang 20}
B: 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 A 1234567
8
% TV