实验2-进程观察实验_第1页
实验2-进程观察实验_第2页
实验2-进程观察实验_第3页
实验2-进程观察实验_第4页
实验2-进程观察实验_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验二进程观察实验(二):进程的控制实验目的1、了解进程创建后对进程控制的系统调用,可实现对进程的有效控制2、掌握进程的睡眠、同步、撤消等进程控制方法实验内容1、通过相关命令,对进程的状态进行控制。2、编写程序,使用fork()创建一个子进程。使用相关的系统调用控制进程的状态。观察并分析多进程的执行次序及状态转换。实验基础一、进程的控制进程因创建而存在,因执行完成或异常原因而终止.在进程的生命周期中,进程在内存中有三种基本状态:就绪,执行,阻塞.进程状态的转换是通过进程控制原语来实现的。Linux操作系统提供了相应功能的系统调用及命令,来实现用户层的进程控制。二、相关的命令(1)睡眠指定时间执行格式:#sleepxx为指定睡眠的秒数。(2)结束或终止进程kill执行格式:#kill[-9]PID(PID为利用ps命令所查出的processID)例:kill-9456终止processID为456的process(3)后台(background)执行processcommand的命令执行格式:#command&(在命令后加上&)例:gccfile1&在后台编译file1.c注意:按下^Z,暂停正在执行的process。键入”bg”,将所暂停的process置入background中继续执行。例:#gccfile1&^Zstopped#bg(4)查看正在background中执行的process执行格式:#jobs(5)结束或终止在background中的进程kill执行格式:#kill%n例:kill%1终止在background中的第一个jobkill%2终止在background中的第二个job三、相关的系统调用在LINUX中fork()是一个非常有用的系统调用,但在LINUX中建立进程除了fork()之外,也可用与fork()配合使用的exec()。1、exec()系列系统调用exec()系列,也可用于新程序的运行。fork()只是将父进程的用户级上下文拷贝到新进程中,而exec()系列可以将一个可执行的二进制文件覆盖在新进程的用户级上下文的存储空间上,以更改新进程的用户级上下文。exec()系列中的系统调用都完成相同的功能,它们把一个新程序装入内存,来改变调用进程的执行代码,从而形成新进程。如果exec()调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新进程,新进程的进程标识符id与调用进程相同。exec()没有建立一个与调用进程并发的子进程,而是用新进程取代了原来进程。所以exec()调用成功后,没有任何数据返回,这与fork()不同。exec()系列系统调用在LINUX系统库unistd.h中,共有execl、execlp、execle、execv、execvp五个,其基本功能相同,只是以不同的方式来给出参数。一种是直接给出参数的指针,如:intexecl(path,arg0[,arg1,...argn],0);char*path,*arg0,*arg1,...,*argn;另一种是给出指向参数表的指针,如:intexecv(path,argv);char*path,*argv[];另外,在linux中,出于安全的考虑,限制了exec()可以执行的新程序的位置为系统指定的搜索路径。例如:execl(“/bin/ls”,”ls”,NULL);execl(“/usr/bin/gcc”,”-v”,NULL);execl(“./test”,NULL);//当前目录下的可执行程序2、exec()和fork()联合使用系统调用exec和fork()联合使用能为程序开发提供有力支持。用fork()建立子进程,然后在子进程中使用exec(),这样就实现了父进程与一个与它完全不同子进程的并发执行。一般,wait、exec联合使用的模型为:intstatus;............if(fork()==0){创建进程:#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<errno.h>#include<sys/types.h>#include<sys/wait.h>intmain(){ pid_tpid; if(-1==(pid=fork())) { printf("Errorhappenedinforkfunction!\n"); return0; } if(0==pid) { printf("Thisischildprocess:%d\n",getpid()); } else { printf("Thisisparentprocess:%d\n",getpid()); } return0;}使用wait函数让父进程等待子进程运行结束后才开始运行。注意,为了证明父进程确实是等待子进程运行结束后才继续运行的,我们使用了sleep函数。但是,在linux下面,sleep函数的参数是秒,而windows下面sleep的函数参数是毫秒。#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(intargc,char*argv[]){pid_tpid;pid=fork();if(0==pid){printf("Thisischildprocess,%d\n",getpid

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论