一【实验目的】
- 熟悉进程环境、进程生命周期;
- 支撑网络空间安全专业的专业核心能力、综合创新能力。
二【实验要求】
以下每个实验均要求:
- “实验源代码”处:粘贴所编写的程序源码,务必添加关键语句的注释;
- “实验结果”:截图(包括编写的程序和运行结果)粘贴到“实验结果”下方,截图需看到本人的名字及学号;
- 有“讨论”的题目,请务必认真回答;
二【实验内容】
3-1在Shell环境下使用进程常用命令:ps、pstree、top、at、kill等,记录命令的运行结果。
3-2编写一个程序,在主进程中创建一个子进程,子进程输出“This is the child
process!”,主进程输出进程号及子进程号。
【源程序】
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(void){
pid_t pid;
if((pid = fork()) == -1){//调用fork()函数创建子进程,若是创建失败返回-1
perror("fork failure!");
exit(1); //退出进程,指定返回值1
} else if(pid > 0){//父进程
printf("parent process,pid = %d,ppid = %d\n",getpid(),getppid());
} else if(pid == 0){//子进程
printf("This is the child process\n");
}
}// of main
//gcc wtc3_2.c -o wtc3_2
3-3编写一个程序,在主进程中分别创建两个子进程,其中一个为僵尸进程,另一个为孤儿进程。
【源程序】
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
int main(void){
pid_t pid;
int i;
for(i = 0; i < 2; i++){//创建两个进程
if((pid = fork()) == 0)//子进程不会再创建进程
break;
}
if(i == 0){//i == 0时创建的为孤儿进程
if((pid = fork()) == -1){//创建失败
perror("fork failure!");
} else if(pid == 0){//子进程
printf("pid = %d,ppid = %d\n",getpid(),getppid());
sleep(3);
printf("pid = %d,ppid = %d\n",getpid(),getppid());
} else {
sleep(1);
printf("parent process PID = %d\n",getpid());
exit(EXIT_SUCCESS);
}
} else if(i == 1){//i == 1时创建的为僵尸进程
sleep(5);
if((pid = fork()) == -1){//创建失败
perror("fork failure!\n");
} else if(pid == 0){//子进程
printf("child process %d will become a zomibie!\n",getpid());
exit(EXIT_SUCCESS);
}
sleep(2);
system("ps u");//查看当前用户有哪些进程
exit(EXIT_SUCCESS);
}
}// of main
// gcc wtc3_3.c -o wtc3_3
3-4编写一个程序,在主进程中创建一个子进程,主进程接收子进程的结束状态,并输出子进程的结束状态。
【源程序】
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
int main(void){
pid_t pid,w;
if((pid = fork()) == -1){ //调用fork()函数创建子进程,若是创建失败返回-1
perror("fork failure!");
exit(1); //退出进程,指定返回值1
} else if(pid == 0){//子进程
sleep(1);//子进程睡眠1秒
printf("Child process:pid = %d\n",getpid());
} else if(pid > 0){ //父进程
w = wait(NULL);//暂停当前进程直至其子进程结束,并获取子进程结束时的状态
printf("Catch a child process,pid = %d\n",getpid());
}
}// of main
3-5(选做)编写一个程序,调用exec簇函数打开所使用系统中的网络浏览器。
【源程序】
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(void){
int flag;
pid_t pid;
char *const argv[] = {"%U", "--user-data-dir=/home/Administrator/firefox", NULL};
if((pid = fork())==0) {
//启动firefox浏览器,在寻找firefox位置时可以用whereis firefox
flag = execv("/usr/bin/firefox", argv);//调用execv,打开Firefox
if(flag == -1){//网页打开失败
printf("exec error!\n");
}else{//网页打开成功
printf("exec success!");
}
}
return 0;
}//of main