西安邮电大学
(计算机学院)
课内实验报告
实验名称:进程
专业名称:软件工程
班级:1201班
学生姓名:
学号(8位):
指导教师:
实验日期:2014年11月12日
一. 实验目的及实验环境
(一)、实验目的
(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)学习通过进程执行新的目标程序的方法。
(4)了解Linux 系统中进程信号处理的基本原理。
(二)、实验环境
Ubuntu
shell + Vim + GCC编译器
二. 实验内容
1.编程实现由一个父进程产生3个子进程,并且给三个子进程传递不同的参
数,收到‘a?的子进程在显示器上输出乘法口诀表;收到…b?的子进程计算10!;收到‘c?的进程计算1+2+3+……+19+20的结果。
2.execve函数的应用,要在程序执行时设定环境变量,路径为tmp,用户为
liu,执行命令env时把这些环境变量传递给系统。在这一函数中,参数e 表示可传递新进程环境变量,参数v表示传递的参数(含命令)为构造指针数组,文件查找需给出路径。命令env在“/bin”目录下。把环境变量设定为:
char *envp[]={“PATH=/tmp”,”USER=liu”,NULL};
参数的构造指针数组为:char *arg[]={“env”,NULL};
因而此函数的调用形式为:execve(“/bin/env”,”env”,envp);
请编写程序进行调试。
三.方案设计
分别编写三个子程序,分别实现输出乘法口诀表,计算10!,计算1+2+3+…+20的结果,并且编译好,主程序中先输出自己的进程号pid,判断命令行输入的参数是a,b,c,并使用系统调用fork()创建进程,然后通过使用execve()函数执行子进程,子进程里输出自己的pid以及ppid,并依次执行自己的功能,由ppid可以看出子进程是本进程的子进程。
四.测试数据及运行结果
五.总结
1.实验过程中遇到的问题及解决办法;
2.对设计及调试过程的心得体会。
通过本次试验,我对进程有了更进一步的掌握,了解了进程的创建方法,系统调用fork()的功能以及如何判断是子进程还是父进程,还知道了多个子进程创建后,它们会同时运行,抢占资源。同时通过另一个程序了解了命令行参数还有环境变量,初步掌握了它的作用。
六.附录:源代码(电子版)
实验1
主程序代码
#include
#include
#include
#include
int main(int argc,char * argv[],char ** environ)
{
int i;
pid_t pid1,pid2,pid3;
int stat_val;
printf("This parentprocess pid is %d\n",getpid());
for(i=1;i<4;i++)
{
if(strcmp("a",argv[i])==0)
{
pid1=fork();
if(pid1==0)
{
// printf("My pid = %d ,parentpid = %d\n",getpid(),getppid());
execve("a",argv,environ);// 让进程去执行新的程序。
return 0;
}
}
if(strcmp("b",argv[i])==0)
{
pid2=fork();
if(pid2==0)
{
// printf("My pid = %d ,parentpid = %d\n",getpid(),getppid());
execve("b",argv,environ);
return 0;
}
}
if(strcmp("c",argv[i])==0)
{
pid3=fork();
if(pid3==0)
{
// printf("My pid = %d ,parentpid = %d\n",getpid(),getppid());
execve("c",argv,environ);
return 0;
}
}
}
for(i=0;i<10000000;i++);
wait(&stat_val);
return 0;
}
a代码:
#include
#include
#include
int main(int argc,char *argv[],char **environ)//注意参数
{
int i,j;
printf("This is a childprocess,pid is %d,ppid is %d\n",getpid(),getppid());
for(i = 1; i < 10; i++)
{
for(j = 1; j <= i; j++)
{
printf("%d*%d=%d\t", i, j, i*j);
}
printf("\n");
}
return 0;
}
B代码:
#include
#include
#include
int main(int argc,char *argv[],char **environ)//注意参数
{
int i,res=1;
for(i = 1; i <= 10; i++)
res *= i;
printf("This is b childprocess,pid is %d,ppid is %d\n",getpid(),getppid());
printf("\n10! = %d\n", res);
return 0;
}
C代码:
#include
#include
#include
int main(int argc,char *argv[],char **environ)//注意参数
{
int i,res=0;
for(i = 1; i <= 20; i++)
res += i;
printf("This is c childprocess,pid is %d,ppid is %d\n",getpid(),getppid());
printf("\n1+2+3+...+19+20=%d\n",getpid(),getppid(),res);
return 0;
}
实验2代码
#include
#include
int main()
{
char *envp[]={"PATH=/tpm","USER=liu",NULL};
char *arg[]={"env",NULL};
printf("the?sysytem's?pid?:%d\n",getpid());
if(execve("/bin/env",arg,envp)<0)
perror("execve");
return 0;
}