Viết chương trình để truyền đối vào số nguyên dương n vào và...102.. Sử dụng lời gọi system để viết chương trình thực thi các lệnh Linux đã học..113.. Tạo ra cây tiến trình như sau, với
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
HK2, 2021-2022 Lab 3 Thành Viên: Nguyễn Ngô Đăng Khoa (521H0084)
Mục lục
A PHẦN THỰC HÀNH 3
Ví Dụ 1: 1.1 Tạo tiến trình 3
Ví Dụ 2: Kết thúc tiến trình 5
B PHẦN BÀI TẬP 10
1 Viết chương trình để truyền đối vào số nguyên dương n vào và 10
2 Sử dụng lời gọi system() để viết chương trình thực thi các lệnh Linux đã học 11
3 Tạo ra cây tiến trình như sau, với mỗi tiến trình con, in ra ID của nó và ID của tiến trình cha 12
4 Viết một chương trình lặp vô tận với lời gọi while(1); và thực thi nó Đưa tiến trình này vào “background” thông qua việc gửi tín hiệu SIGTSTP bằng cách nhấn Ctrl + Z Sử dụng lệnh ps để xác định PID của nó và sử dụng kill để kết thúc nó.14
5 Viết chương trình mà khi chạy nó sinh ra tiến trình con, để tiến trình con trở thành zombie Tiến trình zombie này cần tồn tại trong hệ thống tối thiểu 10 giây (bằng cách dùng lời gọi sleep(10)) Sau đó dùng lệnh ps –l để xem trạng thái các
Trang 2tiến trình Kết liễu zombie này bằng cách xác định PID của tiến trình cha nó và sử dụng lệnh kill 15 KẾT LUẬN 16
Trang 3A PHẦN THỰC HÀNH
Ví Dụ 1: 1.1 Tạo tiến trình
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 //P1.c
#include<stdio.h>
#include<unistd.h>
intmain()
{
printf("Current process ID: %d\n", getpid());
printf("Parent process ID: %d\n", getppid());
return ;0
}
B: Kết Quả Demo
1.2 Biên dịch và xem kết quả khi có lệnh fork():
A: Code Chương trình
// P2.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
intmain()
{ // make two process which run same
// program after this instruction
ộ // Thêm m t vài l nh printf và theo dõi.ệ
fork(); fork();
Trang 4// thêm m t vài l nh fork vào đây và xem thay đ i.
printf("Hello world! from Process ID: %d\n",
getpid());
return ;0
}
B: Kết Quả Demo
1.3 Biên dịch và xem kết quả,:
A: Code Chương trình
// P3.c
#include<stdio.h>
#include<unistd.h>
intmain()
{
pid_t pid;
pid =fork();
(pid ) if <0 printf("fork error! No child created\n"); elseif(pid ==0)
{
//sleep(2);
printf("Hello from Child!\n");
printf("Child ID is %d!\n", getpid());
}
else
{
printf("Hello from Parent!\n");
printf("Parent ID is %d!\n", getpid());
}
Trang 5return ;0
}
B: Kết Quả Demo
Ví Dụ 2: Kết thúc tiến trình
2.1 Hãy biên dịch và thực thi các tập tin zombie.c và orphan.c được cung cấp và dùng lời gọi ps rồi tìm chúng trong bảng tiến trình
A: Code Chương trình
// A C program to demonstrate Zombie Process
// Child becomes Zombie as parent is sleeping
// when child process exits
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
intmain()
{
// Fork returns process id
// in parent process
pid_t child_pid =fork();
// Parent process
(child_pid if >0)
sleep( );10
// Child process
else
exit(0);
return ;0
Trang 6// A C program to demonstrate Orphan Process // Parent process finishes execution while the // child process is running The child process // becomes orphan
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
intmain()
{
// Create a child process
pid int =fork();
(pid )if >0
printf("in parent process\n");
// Note that pid is 0 in child process
// and negative if fork() fails
elseif (pid ==0)
{
sleep( );6
printf("in child process\n");
}
return ;0
}
Trang 7B: Kết Quả Demo
2.2 Sau đây tạo ra một số lượng tiến trình con (được truyền vào qua đối số hàm main), in ra ID của các tiến trình con và lời gọi chờ của tiến trình cha
A: Code Chương trình
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
Trang 8intmain( intargc, char *argv[])
{
pnum, count, retval, child_no;int
pnum =atoi(argv[ ]);1
(pnum if <= ) 0
{
printf("So tien trinh con phai lon hon 0");
return - ;1
}
else
{
retval =1;
for(count ; count pnum; count=0 < ++)
{
(retval if !=0) retval =fork();
elsebreak;
}
(retval if ==0)
{
child_no count;=
printf("Tien trinh %d, PID %d\n", child_no,
getpid());
}
else
{
for(count ; count pnum; count=0 < ++) wait(NULL); printf("Tien trinh cha PID %d\n", getpid()); }
}
status ;int =5
wait(&status); ờ ộ// ch m t trong nh ng đ a con.ữ ứ
return ;0
}
Trang 9B: Kết Quả Demo
2.3 Vòng lặp
A: Code Chương trình
// A C program to demonstrate ignoring // SIGCHLD signal to prevent Zombie processes
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
intmain()
{
i;int
pid int =fork();
(pid if == )0
for = (i ; i ; i0 <5 ++)
printf("I am Child\n");
else
{
signal(SIGCHLD,SIG_IGN);
printf("I am Parent\n");
while( );1
}
}
B: Kết Quả Demo
Trang 10B PHẦN BÀI TẬP
1 Viết chương trình để truyền đối vào số nguyên dương n vào
và
a Tiến trình cha tiếp tục tính rồi xuất ra tổng S = 1 + 2 + … + n
b Đồng thời tạo một tiến trình con tính tổng các ước số của n và in ra màn hình.
A Code chương trình:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
intmain( intargc, char *argv[])
{
pid_t pid =fork();
(pid ) if <0 printf("fork error! No child created\n");
for(int = i 1 1; < argc; i++)
{
k int =atoi(argv[ ]);1
(pid if == )0
{
t ;int =0
for(int = i 1; i <= k; i++)
{
(k i if % == ) t 0 += i;
Trang 11}
printf("Tong cac uoc so la: %d\n", t);
}
else
{
s ;int =0
wait(NULL);
for(int = i 0; i <= k; i++)
s += i;
printf("Tong cac gia tri tu 1 den %d la: %d\n", k, s);
}
return ;0
}
}
B: Kết Quả Demo
2 Sử dụng lời gọi system() để viết chương trình thực thi các lệnh Linux đã học
A Code chương trình:
#include<stdio.h>
intmain( intargc, char *argv[])
{
re;int
printf("Command ls\n");
re =system(" "ls);
Trang 12printf("Command pwd\n");
re =system("pwd");
printf("Command ls -a\n");
re =system("ls -a");
(re if !=-1) printf("System call is done!\n");
printf("Call system to execute ps -a\n");
re =system("ps -a");
(re if !=-1) printf("System call ps is done!\n");
return ;0
}
B: Kết Quả Demo
3 Tạo ra cây tiến trình như sau, với mỗi tiến trình con, in ra ID của nó và ID của tiến trình
cha
A Code chương trình:
#include<stdio.h>
#include<unistd.h>
intmain()
{
Trang 13n1 int =fork();
n2 int =fork();
(n1 if ==0)
{
(n2 if ==0)
{
printf("H ");
printf("my id is %d, my parentid is %d\n",
getpid(), getppid());
}
else
{
printf("C\n");
printf("my id is %d, my parentid is %d\n",
getpid(), getppid());
}
}
elseif(n1 )>0
{
printf("A ");
printf("my id is %d, my parentid is %d\n", getpid(),
getppid());
(n2 if ==0)
{
printf("B\n");
printf("my id is %d, my parentid is %d\n",
getpid(), getppid());
}
}
return ;0
}
Trang 14B: Kết Quả Demo
4 Viết một chương trình lặp vô tận với lời gọi while(1); và thực thi nó Đưa tiến trình này
vào “background” thông qua việc gửi tín hiệu SIGTSTP bằng cách nhấn Ctrl + Z Sử dụng
lệnh ps để xác định PID của nó và sử dụng kill để kết thúc nó
A Code chương trình:
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
intmain()
{
i;int
pid int =fork();
(pid if == )0
for = (i ; i ; i0 <5 ++)
printf("I am Child\n");
else
{
Trang 15signal SIGCHLD( ,SIG_IGN);
printf("I am Parent\n");
while( );1
}
}
B: Kết Quả Demo
5 Viết chương trình mà khi chạy nó sinh ra tiến trình con, để tiến trình con trở thành zombie
Tiến trình zombie này cần tồn tại trong hệ thống tối thiểu 10 giây (bằng cách dùng lời gọi
sleep(10)) Sau đó dùng lệnh ps –l để xem trạng thái các tiến trình Kết liễu zombie này
bằng cách xác định PID của tiến trình cha nó và sử dụng lệnh kill
A Code chương trình:
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
intmain()
{
pid_t child_pid =fork();
Trang 16
// Child process
(child_pid if >0)
printf("%d\n",getpid());
// Parent process
elseif(child_pid == ) 0
sleep( );10
return ;0
}
B: Kết Quả Demo
KẾT LUẬN
Sau khi học và hoàn thành phần lab 2 em thu được kết sau:
- Hoàn thành tất cả phần thực hành
- Hoàn thành được 5 bài tập (1, 2, 3, 4, 5) [71%]