欢迎来到天天文库
浏览记录
ID:53008576
大小:736.25 KB
页数:24页
时间:2020-04-11
《Linux多进程编程-PPT--详细讲解.pptx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux多进程编程主要内容LINUX进程介绍1Linux多进程编程2Linux多进程通讯3多进程实例4LINUX进程介绍什么是进程简单地说就是允许起来的程序,即应用程序的运行实例。进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任务。LINUX进程介绍进程ID唯一标识进程的非负整形变量,pid。init进程内核自举启动后运行的第一个进程,/etc/inittab是它启动的配置文件,所有的孤儿进程的父
2、进程为init。LINUX进程介绍进程的结构Linux下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段"。其实学过汇编语言的人一定知道,一般的CPU都有上述三种段寄存器,以方便操作系统的运行。这三个部分也是构成一个完整的执行序列的必要的部分。LINUX进程介绍进程的结构"代码段",顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用相同的代码段。"堆栈段"存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。系统如果同时运行数个相同的程序,它们之间就不能使用同一个堆栈段和数据段。LINUX进程介绍
3、进程的优点对不同进程来说,它们具有独立的数据空间、代码空间和堆栈空间。因此,相比于线程而言,进程有更好的健壮性。LINUX进程介绍进程带来的问题由于不共享数据段,进程相比于线程而言,各个进程间的通讯比较麻烦。必须依靠信号量、管道、共享内存和socket等方式进行通讯。并且,进程的开销也远远大于线程。LINUX多进程编程forkfork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。LINUX多进程编程
4、Linux下的fork这个函数名是英文中“分叉”的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就“分叉”了,所以这个名字取得很形象。它的返回值为:如果在父进程中返回子进程的pid,如果是在子进程中则返回0。LINUX多进程编程Linux下的fork当fork函数执行完毕后,内核并不会马上复制父进程的堆、栈和数据段到子进程,而是采用COW技术,使两者的这些内容变为只读共享,一旦其中一个进程内改变了某页内容,那么就进行复制该页。LINUX多进程编程voidmain(intac,char*av[]){inti;if(fo
5、rk()==0){/*子进程程序*/for(i=1;i<1000;i++)printf("Thisischildprocess");} else{/*父进程程序*/for(i=1;i<1000;i++)printf("Thisisprocessprocess");} }LINUX多进程编程voidmain(){ for(;;)fork();}可以预先给每个用户设置可运行的最大进程数,这样,只要不是root,任何能运行的进程数也许不足系统总的能运行和进程数的十分之一,这样,就能对付上述恶意的程序了。exec函数族成员函数所需头文件#include6、>函数原型intexecl(constchar*path,constchar*arg,…)intexecvl(constchar*path,char*constarg[])intexele(constchar*path,constchar*arg,…,char*constenvp[])intexecve(constchar*path,char*constarg[],char*constenvp[])intexeclp(constchar*file,constchar*arg,…)intexecvp(constchar*file,char*constarg[])返回值7、-1:出错exec函数族成员函数前四位统一为exec第5位l:参数传递为逐个列举方式(list)execl,execle,execlpv:参数传递为构造指针数组(vertor)execv,execve,execvp第6位e:可传递新进程环节变量(environment)execle,execvep:可执行文件查找方式为文件名execlp,execvpexec函数族成员函数#include#include#includeintmain(){if(fork()==0)if((ret=execlp(“ps”,”
6、>函数原型intexecl(constchar*path,constchar*arg,…)intexecvl(constchar*path,char*constarg[])intexele(constchar*path,constchar*arg,…,char*constenvp[])intexecve(constchar*path,char*constarg[],char*constenvp[])intexeclp(constchar*file,constchar*arg,…)intexecvp(constchar*file,char*constarg[])返回值
7、-1:出错exec函数族成员函数前四位统一为exec第5位l:参数传递为逐个列举方式(list)execl,execle,execlpv:参数传递为构造指针数组(vertor)execv,execve,execvp第6位e:可传递新进程环节变量(environment)execle,execvep:可执行文件查找方式为文件名execlp,execvpexec函数族成员函数#include#include#includeintmain(){if(fork()==0)if((ret=execlp(“ps”,”
此文档下载收益归作者所有