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.. Viết một chương trình lặp vô tận với lời gọi while1; và thực thi nó.. Viết chương trình mà khi chạy nó
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>
int main()
{
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>
int main()
{ // 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>
int main()
{
pid_t pid;
pid = fork();
if(pid ) < 0 printf( fork error! No child created\n"); else if(pid == )
{
//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>
int main()
{
// Fork returns process id
// in parent process
pid_t child_pid = fork();
// Parent process
if (child_pid > 0)
sleep(10);
// Child process
else
exit( );
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>
int main()
{
// Create a child process
int pid = fork();
if (pid )> 0
printf( in parent process\n");
// Note that pid is 0 in child process // and negative if fork() fails
else if (pid == )
{
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 8int main(int argc, char *argv[])
{
int pnum, count, retval, child_no;
pnum = atoi(argv[ ]);1
if(pnum <= ) 0
{
printf( So tien trinh con phai lon hon 0");
return -1;
}
else
{
retval = 1;
for(count ; count pnum; count= 0 < ++)
{
if(retval != ) retval = fork();
else break;
}
if(retval == )
{
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()); }
}
int status ;= 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>
int main()
{
int i;
int pid = fork();
if (pid == )0
for (i= ; i< ; i++)
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>
int main(int argc, char *argv[])
{
pid_t pid = fork();
if(pid ) < 0 printf( fork error! No child created\n"); for(int i = 1; 1 < argc; i++)
{
int k = atoi(argv[ ]);1
if(pid == )0
{
int t ;= 0
for(int i = 1; i <= k; i++)
{
if(k i % == ) t 0 += i;
Trang 11}
printf( Tong cac uoc so la: %d\n", t);
}
else
{
int s ;= 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>
int main(int argc, char *argv[])
{
int re;
printf( Command ls\n");
re = system( ls");
Trang 12printf( Command pwd\n");
re = system( pwd");
printf( Command ls -a\n");
re = system( ls -a");
if(re != 1) printf( System call is done!\n");
printf( Call system to execute ps -a\n");
re = system( ps -a");
if(re != 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>
int main()
{
Trang 13int n1 = fork();
int n2 = fork();
if(n1 == )
{
if(n2 == )
{
printf(" \n");
printf( my id is %d, my parentid is %d \n",
getpid(), getppid());
}
else
{
printf(" \n");
printf( my id is %d, my parentid is %d \n",
getpid(), getppid());
}
}
else if(n1 )> 0
{
printf(" \n");
printf( my id is %d, my parentid is %d \n", getpid(),
getppid());
if(n2 == )
{
printf(" \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>
int main()
{
int i;
int pid = fork();
if (pid == )0
for (i= ; i< ; i++)
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>
int main()
{
pid_t child_pid = fork();
Trang 16
// Child process
if (child_pid > 0)
printf( %d\n" getpid());
// Parent process
else if(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%]