linux父子进程家族树,第3次小课.Linux进程与线程.ppt

《第3次小课.Linux进程与线程.ppt》由会员分享,可在线阅读,更多相关《第3次小课.Linux进程与线程.ppt(21页珍藏版)》请在人人文库网上搜索。

1、第三次小课 Linux进程 与线程,华软软件工程系,创建进程实验课主要内容 本周大课内容回顾 通过实验理解Linux进程家族树、父子进程简单同步的实现,主要内容,第一部分 本周大课 内容回顾,同步与互斥,大课回顾,什么是临界资源?进程同步和互斥的定义? 进程死锁的概念? 用PV原语实现互斥的一般方法?信号量初值? 用PV原语实现同步的一般方法?信号量初值?,第二部分 Linux进程 实验,实验1 Linux进程家族树,文件名3-1.c:看程序写结果。 #include main() fork(); printf(“it will be printed twicen”); 要求: 增加1个for。

2、k()、2个fork()、多个fork()的结果会怎样?并说明原因,找出规律。 在fork()语句后添加如下2条语句,结果将如何? printf(“get the child pid: %dn”,getpid(); printf(“get the parent pid: %dn”,getppid();,3-1.c,#include main() fork(); printf(“it will be”); printf(“get the child pid: %dn”,getpid(); printf(“get the parent pid: %dn”,getppid(); ,init进程,in。

3、it进程是系统所有进程的起点,内核在完成内核引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。init进程是所有进程的发起者和控制者。因为在任何基于UNIX的系统(比如 Linux)中,它都是第一个运行的进程,所以init进程的编号(Process ID,PID)永远是1。如果init出现了问题,系统的其余部分也就随之不可用。,init进程,init进程有两个作用: 扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了。

4、父进程的子进程都会以init作为它们的父进程。快速执行一下“ps af”或者top或者gnome-system-monitor命令,可以列出当前运行的进程来。 在进入某个特定的运行级别(Runlevel)时运行相应的程序,以此对各种运行级别进行管理。,实验2 父子进程同步实验,文件名3-2.c:实现子进程先输出”child proc”,父进程后输出” parent proc”。 要求 请总结实现简单的父子进程同步的一般方法,3-2.c,#include #include main() int p1; while(p1=fork()=-1); if(p10) wait(0); printf(pa。

5、rent procn); else printf(child procn); exit(0); printf(“test1n); printf(“test2n); ,Linux中父子进程同步,相关系统调用 1)进程终止 void exit(stat); 主要任务:自我终止,将进程状态变为”僵死”状态,等待父进程用wait系统调用来收集。 一般参数可设为0,即exit(0) exit():在执行该函数时,进程会检查文件打开情况,清理I/O缓存,如果缓存中有数据,就会将它们写入相应的文件,这样就防止了文件数据的丢失!然后终止进程。,Linux中父子进程同步,_exit():在执行该函数时,并不清理。

6、标准输入输出缓存,而是直接清除内存空间,当然也就把文件缓存中尚未写入文件的数据给销毁了。由此可见,使用exit()函数更加安全。 父进程等待子进程终止 pid_t wait(int *stat_addr, 0) 一般参数可设为0,即wait(0),实验3 子进程映像的重新装入,创建一进程child.c,功能是输出”I am a child.”,再创建一个父进程3-3.c加载该子进程 。 要求 理解子进程映像的重新装入。,Linux中子进程映像的重新装入,Linux提供了一组系统调用exec函数,主要功能是将指定的可执行文件加载到指定的进程映像中,覆盖该进程映像中原有的程序。 此类系统调用有ex。

7、ecl()、execle()、execlp()、execv()、execve()、execvp() 本课只介绍execl()和execv() execl(“路径名/文件名”,0) execv(file,argv) 参数定义: char *file 指向文件全名(路径名/文件名)的指针; char *argvn指向命令及参数的指针。 加载成功则直接执行,不返回;不成功返回-1,Child.c,#include #include main() printf(I am a childn); exit(0); ,创建一个child.c源文件并编译成child执行文件,3-3.c,#include #i。

8、nclude #include void main() int p; while(p=fork()=-1); if(p=0) execl(“./child”,0,NULL); /调用child文件,第三参数需要一个空指针,用null代替 else wait(0); exit(0); ,实验4 子进程映像的重新装入,创建一进程child1.c,再创建一个父进程3-4.c加载该子进程 。 要求 理解子进程映像的重新装入。 掌握exec类函数的用法及功能。 3-4.c:改写子进程的功能为调用键盘命令ls l,已知该键盘命令的路径与文件名为:/bin/ls 在子进程分支中,用execl加载自己的程序后。

9、,添加一条语句如 printf(“ok!n”); 结果将如何?,Child1.c,#include #include #include main() char* path=/bin/ls; char* argv4=ls,-a,NULL; execv(path,argv); exit(0); ,3-4.c,#include #include #include void main(int argc, char* argv) int p; while(p=fork()=-1); if(p=0) execl(./child1,0,NULL); printf(OK); else wait(0); exit(0); ,谢 谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值