文档库 最新最全的文档下载
当前位置:文档库 › 西安邮电大学linux进程

西安邮电大学linux进程

西安邮电大学

(计算机学院)

课内实验报告

实验名称:进程

专业名称:软件工程

班级: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;

}

相关文档
相关文档 最新文档