共享linux课件系统编程多进程_第1页
共享linux课件系统编程多进程_第2页
共享linux课件系统编程多进程_第3页
共享linux课件系统编程多进程_第4页
共享linux课件系统编程多进程_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、进程控制目标:本章向学员介绍进程控制理论,通过本课的学习,学员应该掌握如下知识:进程的定义、特点、状态进程ID、 进程互斥、死锁临界资源、临界区进程同步、 进程调度进程创建、exec函数族、进程等待及退出1.1 定义执行caxt|wcl从操作上看是实现统计a.txt文本的行数的功能,从程序的角度,就是两个进程间通过管道进行通信的例子。进程由程序代码、数据、变量、打开的文件和环境组成,linux系统会在进程之间共享程序代码和系统函数库。进程是一个具有一定独立功能的程序的一次运行活动。每个运行着的程序就一个进程,就好像linux系统下ls命令1.2 进程状态就绪IO完成时间片完进程调度阻塞执行IO

2、请求1.3 进程ID进程ID():标识进程的唯一数字。每个进程都有唯一的进程ID号,通过进程ID可以查找到相应的进程及了解进程的当前状态。父进程的ID(P)启动进程的用户ID(UID)1.4 进程互斥了该资源为止。进程互斥是指当有若干进程都要使用某一共享资源时,任何时 刻最多允许一个进程使用,其他要使用该资源的进程必须等待,为实现进程互斥,可以利用方法,也可以利用同步机制来协调多个进程,但是应该遵循四准则:空闲让进、忙则等待、有限等待、让权等待直到占用该资源者1.5 临界资源进程中临界资源的那段代码称为临界区。为实现对临界资源的互斥,应保证诸进程互斥地进入各自的临界区。缓冲队列、变量、数组、缓

3、冲区等。 诸进程间应采取互斥方式,实现对这种资源的共享。属于临界资源的硬件有、传真机等,有消息临界资源是指每次仅允许一个进程的资源。1.6 进程同步发送事件请求事件任务1任务2事件一组并发进程按一定的顺序执行的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。1.7 死锁资源时,使用相反的顺序;4)使用等待超时。防止死锁的方法:先得到全部需要的资源,再做下一步的工作;用同样的顺序申请多个资源;3)指两个任务无限期地互相等待对方控制着的资源。假设任务T1正独享资源R1,任务T2正独享资源R2,此时任务T1又要使用资源 R2,任务T2也要使用资源

4、R1,于是两个任务都无法继续执行了。1.8 进程调度调度方式:抢占式非抢占式调度算法:先来先服务调度算法短进程优先调度算法高优先级优先调度算法时间片轮转法按一定算法,从一组待运行的进程中选出一个来占有CPU运行。1.9 进程编程:获取_tget(void)获取P:_tgetp(void)功能:获取父进程ID。功能:获取本进程ID。1.9.1 获取、P#include #include #include main(void)pr() );pr() );return 0;f( P= %dn, getpf( = %dn, get1.9.2 获取PGID、EUID功能:获取指定进程的进程组号,参数为指

5、定的进程号。功能:获取当前进程的进程有效用户号。EUID用于权限检查。获取EUID:uid_t geteuid(void)获取PGID:_t getpgid(_t)1.9.3 进程的创建fork_tfork(void)功能:创建程。fork的奇妙之处在于它被调用一次,却返回两次。它有三种不同的返回值:在父进程中,fork返回新创建的程的;程中,fork返回0;在如果出现错误,fork返回一个负值。1.9.3 进程的创建fork#include #include main()_t;/*此时仅有一个进程*/=fork();/*此时已经有两个进程在同时运行*/ if(0)prf(error in f

6、ork!); else if(=0)prf(I am the child pros, ID is %dn,get();elseprf(I am the parent pros,ID is %dn,get();执行后的结果?1.9.3 进程的创建fork在=fork()之前,只有1个进程在执行,但在这条语句执行 之后,就变成2个进程在执行。这两个进程的代码部分完全相同,将要执行的下一条语句都是if(=0)。两个进程中,原先就存在的那个进程被称作“父进程”,新出现的那个进程被称作“程的区别在于进程标识符()不同。程”,父$./fork_testI am the parent pros, my pr

7、os ID is 1991 I am the child pros, my pros ID is 19921.9.3 进程的创建fork#include #include main(void)思考执行结果 ?_t;count=0;= fork(); f( This isf( This isprprtime,second time,= %dn,= %dn,););count+;prif (f(count =0 )%dn, count);pr else ifpr elseprf( !f(This)Thisis parent pros,the childhasthd:%dn,);is the chi

8、ld pros.n);f(forkfailed.n);prprf(f(This is third time,This is fouth time,=%dn,%dn,););return 0;1.9.3 进程的创建fork问题:为何count+执行了两次,第2次打印count却为1?This istime,= 0This is second time,= 0count = 1This is the child pros.This is third time,= 0= 0= 3512This is fouth time,This istime,This is second time,= 3512c

9、ount = 1This is the parent pros,the child has:3512This is third time,This is fouth time,= 3512= 35121.9.3 进程的创建fork分析:父进程的数据空间、堆栈空间都会给程一个拷贝,而不是共享这些内存。在程中对count进行自加1的操作,但是并没有影响到父进程中的count值,父进程中的count值仍然为0。1.9.4 进程创建fork练习程 6714程 6713主进程 6712fork()fork()程 6715fork()i=1 Ok:3i=0i=1 Ok:4i=0i=1 Ok:2i=1 Ok

10、:1 分析程序getpgid.c1.9.5 进程对打开文件的处理程对文件描述符的文件表项信息(文件读写位置)是共享使父用的。创建程后,父程对打开文件的处理方式如下所示:父进程信息task _struct打开文件列表file_struct打开的文件struct file管道的读端程信息task_struct打开文件列表file_structfd1=0fd2=1fd3=2fd4=3文件读写位置文件 v节点位置filesV节点信息I 节点信息打开的mode操作指针fd1=0fd2=1 fd3=2fd4=3files1.9.6 进程对打开文件处理练习 分析程序fork_descriptor.c1.9.

11、7 进程的创建vfork_tvfork(void)功能:创建程。fork与vfork区别:fork要拷贝父进程的数据段;而vfork则不需要完全拷贝父进程的数据段,程与父进程共享数据段。fork不对父程的执行次序进行任何限制;而在vfork调用中,程先运行,父进程挂起。1.9.7 进程的创建vfork#include#include #includemain()count = 1; child;f(“Before createprson, the fathers count is:%dn”, count);if(!(child = vfork()prf(This is son, hisis:

12、%d andthe count is:%dn,get(), +count);exit(1);else pr the count is: %d,f(After son, This isfather, hisis: %d and count, child);nd the childis: %dn, get(1.9.8 在子函数中调用vfork时间调用test函数调用fun函数调用main函数调用main函数栈 增 长 方 向局部变量空间主程序调用后返回地址主程序参数局部变量空间主程序调用后返回地址主程序参数局部变量空间fun函数调用后返回地址fun函数参数局部变量空间test函数调用后返回地址te

13、st函数参数 编译vfork_return.c后执行程序,并分析结果。1.9.8 exec函数族execlp(constchar*file,constchar*arg,)#include main()execlp(”ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);功能:从PATH环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv0、 argv1,最后一个参数必须用空指针(NULL)作结束。1.9.8 exec函数族fork与exec函数族的区别:fork创建一个新的进程,产生一个新的。exec启动一个

14、新程序,替换原有的进程,因此进程的不会改变,和调用exec函数的进程试分析:execlp.c一样。exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容。1.9.8 exec函数族execl(constchar*path,constchar*arg,.)#include main()if(=fork()=0)execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);elseprf(“father ok!n”);功能:运行参数path所指定的可执行文件,接下来的参数代表执行该文件时传递过去的argv0、argv1,最后一个

15、参数必须用空指针 (NULL)作结束。1.9.8 exec函数族execv(constchar*path,char*constargv)#include main()char * argv =“ls”,”-al”,”/etc/passwd”,(char*)0; execv(“/bin/ls”,argv);功能:执行参数path所指定的文件,与execl()不同的地方在于它只需两个参数,第二个参数利用指针数组来传递给执行文件。1.9.9 system函数system(constchar*string )功能:system函数调用fork()产生程来调用/bin/sh - 程,由cstring来执

16、行参数string字符串所代表令,直到程结束后才继续运行父进程。include main()system(“ls -al /etc/passwd/shadow”);1.9.10 exec对打开文件的处理 编译及 ewcode.c后执行程序exec,并观察结果。执行exec函数时,并不关闭原来的文件描述符。1.9.11 进程等待功能:进程一旦调用了wait,就立即阻塞自己,直到自己的某个程退 出,如果没有找到这样一个程,wait就会一直阻塞在这里,直到有一个出现为止。参数:sus用来保存被收集进程退出时的状态,一般设为NULL。返回:如果成功,wait会返回被收集的程的进程ID。_t wait

17、(* sus)1.9.11 进程等待#include #include #include #include main()_t pc,pr; pc=fork();if(pc0时,只等待进程ID等于的程,不管其它已经有多少子程还没有结束,wait进程运行结束退出了,只要指定的就会一直等下去。=-1时,等待任何一个的作用一模一样。程退出,没有任何限制,此时和wait2.=0时,等待同一个进程组中的任何-1时,等待一个指定进程组中的任何的绝对值。程。程,这个进程组的ID等3.4.于参数option可以为0或下面的OR组合:WNOHANG:若指定的程没有结束,则wait()函数返回0,不程的ID。予以等待。若结束,则返回该WUNTRACED:如果程进入暂停执行情况则马上返回。1.9.12 进程退出exit/_exit与return的区别?_exit的作用:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的数据结构。exit与_exit函数不同,使进程停止运行之前要检查文件打开情况,并把文件缓冲区的内容写回文件中去之后才停止进程。void exit()、void _exit()1.9.13 孤儿进程程被init收养的进程为孤儿进程。#include #include #include main();if(=fork()=-1)perro

温馨提示

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

评论

0/150

提交评论