计算机操作系统O实验三
* 实验三 Linux进程及信号灯 一、目的 了解并掌握Linux进程及信号灯。 二、要求 1、了解Linux进程与信号灯使用: (1) Linux进程控制 (2)Linux信号灯 (3) Linux 共享内存 (4)进程互斥/同步 三、内容 1、熟悉Linux进程接口; 2、了解Linux信号灯的编程; 3、了解Linux共享内存的使用; 3、编程模拟实现誊抄; 创建三个誊抄进程; 基于共享内存建立缓冲区; 创建同步信号灯; 对各誊抄进程施加P、V操作。 四、预备知识 1、Linux进程基本接口 进程创建:新进程是调用fork( )父进程的副本,称为子进程。子进程继承了父进程的许多特性,具有与父进程完全相同的用户级上下文,父进程与子进程并发执行。 接口:int fork( ) >0:父进程返回,子进程的PID; =0:子进程返回; -1:创建失败。 加载程序 :exec( )系列 exec( )系列可以将一个可执行的二进制文件覆盖在进程的用户级上下文的存储空间上,即把一个新程序装入内存,来改变调用进程的执行代码。如果exec( )调用成功,进程从新程序的入口开始执行。 exec( )系列系统调用在unistd.h中,共有execl、execlp、execle、execv、execvp五个,其基本功能相同,只是以不同的方式来给出参数。 一种是直接给出参数的指针,如: int execl(path,arg0[,arg1,...argn],0); char *path,*arg0,*arg1,...,*argn; 另一种是给出指向参数表的指针,如: int execv(path,argv); char *path,*argv[ ]; wait、exec联合使用的示例: int status; int pid; pid = fork( ); if (pid= =0) { ...........; /*执行命令ls -l -color */ execl("/bin/ls","ls","-1","-color",NULL); ...........; } wait(&status); 等待子进程结束wait 如果子进程没有完成,父进程一直等待。wait( )将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在wait( )前已有子进程暂停或终止,则调用进程做适当处理后便返回。 int wait(status) int *status; 其中,status是用户空间的地址。它的低8位反应子进程状态,为0表示子进程正常结束,非0则表示出现了各种各样的问题;高8位则带回了exit( )的返回值。exit( )返回值由系统给出。 进程终止exit 系统调用格式: void exit(status) int status; 其中,status是返回给父进程的一个整数,以备查询。 为了及时回收进程所占用的资源并减少父进程的干预,UNIX/LINUX利用exit( )来实现进程的自我终止,exit(0)表示进程正常终止,exit(1)表示进程运行有错,异常终止。 如果调用进程在执行exit( )时,其父进程正在等待它的终止,则父进程可立即得到其返回的整数。 2、Linux共享内存 共享存储区是UNIX系统中通信速度最高的一种通信机制。该机制可使若干进程共享主存中的某一个区域,且使该区域出现(映射)在多个进程的虚地址空间中。 进程A的映像 内存 进程B的映像 正文 数据 A A’ 栈 共享存储区 正文 数据 B B’ 栈 共享存储区机制只为进程提供了用于实现通信的共享存储区和对共享存储区进行操作的手段,当用户需要使用该机制时,必须自己设置同步和互斥措施才能保证实现正确的通信。 创建、获得一个共享存储区shmget 系统调用格式: int shmget(key,size,flag); key_t key; //key是共享存储区的名字 int size, //size是其大小(以字节计); int flag;//flag是用户设置的标志,如IPC_CREAT。IPC_CREAT表示若系统中尚无指名的共享存储区,则由核心建立一个共享存储区;若系统中已有共享存储区,便忽略IPC_CREAT。该函数使用头文件如下: #include #include #include 共享存储区的附接shmat 从逻辑上将一个共享存储区附接到进程的虚拟地址空间上。