如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
实验一linux进程的创建与控制【实验目的】1、加深对进程概念的理解,明确进程和程序的区别;2、进一步认识并发执行的实质;3、分析进程争用资源的现象,学习解决进程互斥的方法;【实验环境】编程环境:TC或者VC操作系统软件:linux【准备知识】一.基本概念1、进程的概念;进程与程序的区别。2、并发执行的概念。3、进程互斥的概念。二.系统调用系统调用是一种进入系统空间的办法。通常,在OS的核心中都设置了一组用于实现各种系统功能的子程序,并将它们提供给程序员调用。程序员在需要OS提供某种服务的时候,便可以调用一条系统调用命令,去实现希望的功能,这就是系统调用。因此,系统调用就像一个黑箱子一样,对用户屏蔽了操作系统的具体动作而只是控制程序的执行速度等。各个不同的操作系统有各自的系统调用,如windowsAPI,便是windows的系统调用,Linux的系统调用与之不同的是Linux由于内核代码完全公开,所以可以细致的分析出其系统调用的机制。三.相关函数。1fork()函数fork()函数创建一个新进程。其调用格式为:intfork();其中返回int取值意义如下:正确返回:等于0:创建子进程,从子进程返回的ID值;大于0:从父进程返回的子进程的进程ID值。错误返回:等于-1:创建失败。2wait()函数wait()函数常用来控制父进程与子进程的同步。在父进程中调用wait()函数,则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,会产生一个终止状态字,系统会向父进程发出SIGCHLD信号。当接到信号后,父进程提取子进程的终止状态字,从wait()函数返回继续执行原程序。其调用格式为:#include<sys/type.h>#include<sys/wait.h>(pid_t)wait(int*statloc);正确返回:大于0:子进程的进程ID值;等于0:其它。错误返回:等于-1:调用失败。3exit()函数exit()函数是进程结束最常调用的函数,在main()函数中调用return,最终也是调用exit()函数。这些都是进程的正常终止。在正常终止时,exit()函数返回进程结束状态。其调用格式为:#include<stdio.h>voidexit(intstatus);其中status为进程结束状态。4kill()函数kill()函数用于删除执行中的程序或者任务。其调用格式为:kill(intPID,intIID);其中:PID是要被杀死的进程号,IID为向将被杀死的进程发送的中断号。关于Linux下的C语言编程1)编辑器可使用vi2)编译器使用gcc格式:gccoptionfilename例如:gcc-omainmain.c主要的option-o指定输出文件名(不指定则生成默认文件a.out)其它的参数见帮助(mangcc)【实验内容和步骤】1.进程的创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符,父显示"a",子进程分别显示“b”和“c”,观察记录显示结果,并分析原因。#include<stdio.h>main(){intp1,p2;while((p1=fork())==-1);if(p1==0)putchar('b');else{while((p2=fork())==-1);if(p2==0)putchar('c');elseputchar('a');}}运行运行结果:root@localhost~]#gcc-olsjlsj.c[root@localhost~]#./lsjbca[root@localhost~]#./lsjbca[root@localhost~]#./lsjbca[root@localhost~]#./lsjba[root@localhost~]#c./lsjbca[root@localhost~]#./lsjbca[root@localhost~]#./lsjbca[root@localhost~]#./lsjca[root@localhost~]#b分析原因:①从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,所以父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。②由于函数printf()在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。但由于进程并发执行的调度顺序和父子进程抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。2.进程控制(修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在