收藏 分享(赏)

5.Linux进程与进程环境.ppt

上传人:eukav 文档编号:8464013 上传时间:2019-06-29 格式:PPT 页数:37 大小:238KB
下载 相关 举报
5.Linux进程与进程环境.ppt_第1页
第1页 / 共37页
5.Linux进程与进程环境.ppt_第2页
第2页 / 共37页
5.Linux进程与进程环境.ppt_第3页
第3页 / 共37页
5.Linux进程与进程环境.ppt_第4页
第4页 / 共37页
5.Linux进程与进程环境.ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

1、LINUX进程与进程管理(1),程序和进程区别,程序是为了完成某种任务而设计的软件,比如OpenOffice是程序。而进程就是运行中的程序。简单的说,进程是操作系统中正在运行的任务,而程序是指存储在磁盘上包含有可执行机器代码的指今的文件。程序员常常把源代码称为程序。 一个运行着的程序,可能有多个进程。 例如一个网络服务器,当管理员启动服务后,可能会有好多人来访问,就是说许多用户来同时请求httpd服务,服务器将会创建有多个httpd进程来对其进行服务。,进程的分类,1、交互进程 2、批处理进程 3、守护进程,虚拟内存,我们在安装Linux的时候,需要建立一个交换分区,该分区实际上被用作内存的扩

2、展。系统把暂时不会用到的数据到交分区中,在需要的时候在把磁盘中内容读回内存。这样可以内存空间不足的问题。而这段扩展的内存被称为虚拟内存。,进程内存结构,在32位系统中,4GB的进程地址空间被分为用户空间和内核空间两个部分。用户空间占03GB,内核空间范围是3GB4GB,每个进程都运行在自己的内存空间中,进程内存结构分为三个不同的数据段。 1、代码段 2、数据段 3、堆栈段,内存结构图,代码段,初始化数据段,未初始化数据段,数据段,堆,栈,用户空间,内核空间,进程标识,进程标识,LINUX中使用进程ID来标识一个进程,每个进程都有自己独一无二的ID,在LINUX中除了init进程外,都可能使用k

3、ill命令杀死该进程。当系统为一个新进程分配ID达到系统最大值时,系统会重新使用最小且当前没有被使用的PID号。,获取进程ID号函数,在程序中可以使用getpid和getppid函数获得进程ID Pid_t getpid(void) Pid_t getppid(void) 这两个函数成功返回进程PID和PPID,失败返-1。,实例,int main(int argc,char *argv) printf(“the current programs pid is %dn“,getpid(); /引用函数 return 0; ,进程组号(PGID),在 Linux 系统中,每个用户都拥有用户号(U

4、ID)和用户组号(GUID),和用户管理一 样,进程也拥有自己的进程号(PID)和进程组号(PGID)。当进程生成子进程时,操作系统会自动创建一个进程组。初始的父进程即为主进程,其 PID 和所在的进程组号(PGID)一致,因此,主进程创建的所有进程拥有相同的进程组号(PGID)。,获取进程组号,extern _pid_t getpgid (_pid_t _pid) 函数参数 pid 为要获得进程组号的进程号, 如果执行成功将返回当前进程的进程组号(PGID), 如果执行失败则返回-1,,实例,int main(int argc,char *argv) int i; printf(“t pid

5、t ppid t pgidn”);/提示信息 printf(“parentt%dt%dt%dn”,getpid(),getppid(),getpgid(0);/当前进程信息 for(i=0;i if(fork()=0) printf(“childt%dt%dt%dn”,getpid(),getppid(), getpgid(0); /子进程信息 return 0; rootlocalhost reer# gcc -o getpgid_example getpgid_example.c rootlocalhost reer# ./getpgid_example /执行 pid ppid pgid

6、 parent 4848 4705 4848 /主进程,pid=pgid,父进程为当前 shell child 4849 4848 4848 /子进程,pid 依次增加,pgid=ppid父进程 ID child 4850 4849 4848 /子进程,pid 依次增加,pgid=ppid父进程 ID,进程用户标识,真实用户标识,当root用户创建新用户时,会给每个用户分配一个用户ID(UID)。可以在/etc/passwd中查用户UID信息。例如: rootlocalhost # ls -l /etc/passwd -rw-r-r- 1 root root 1582 Mar 19 06:37

7、 /etc/passwd 文件的创建者为 root,即真实 ID 为 root UID用于表示进程的创建者,只有进程的创建者和root用户才有权限对进程进行操作。,获取真实用户号(UID),extern _uid_t getuid (void) 此函数无参数,如果执行成功将返回当前进程的 UID;如果执行失败则返回-1,,进程有效用户号(EUID),EUID 主要用于权限检查。多数情况下, EUID 和 UID 相同。如果可执行文件的 setuid位有效,在除该文件的拥有者之外的用户运行该程序时,EUID 和 UID 则不相同。 /etc/passwd 文件用来存储所有用户信息,,获取进程有效

8、用户号,extern _uid_t geteuid (void) 此函数没有参数。如果执行成功将返回当前进程的 EUID;如果执行失败则返回-1,进程用户组号(GID),创建进程的用户所在的组号为该进程的进程用户组号。可使用getgid函数来获得当前进程的真实用户组号。extern _uid_t getgid (void) 此函数无参数,如果执行成功将返回当前进程的 GID。如果执行失败则返回-1,有效进程用户组号(EGID),可以通过调用 getegid 函数来获得当前进程的有效用户组号(EGID)。extern _uid_t getegid (void) 此函数无参数,如果执行成功将返回当

9、前进程的 EGID;如果执行失败则返回-1,实例,int main(int argc,char *argv) printf(“tuidtgidteuidtegidn“); printf(“parentt%dt%dt%dt%dn“,getuid(),getgid(),geteuid(),getegid(); /读取并打印 id 信息 if(fork()=0) printf(“childt%dt%dt%dt%dn“,getuid(),getgid(),geteuid(), getegid() ); return 0; rootlocalhost $ ./getid_example /运行 uid

10、gid euid egid parent 500 500 500 500 child 500 500 500 500,LINUX进程控制,进程,在开发应用程序时,程序员需要有效地管理进程,常见的进程管理方式包括:创建进程、获取进程信息、设置进程属性、执行进程、退出进程和跟踪进程等主要操作。,创建进程,操作系统需要一种机制用于创建新的进程,fork函数和vfork函数就是linux提供给程序开发人员用于创建进程的方法。extern _pid_t fork (void) 如果执行成功,在父进程中将返回子进程(新创建的进程)的 PID,类型为 pid_t, 在子进程将返回 0,以区别父子进程。,Fo

11、rk说明,fork 函数调用成功后,其子进程会复制父进程的数据和堆栈空间,并继承父进程的用户代码、组代码、环境变量、已经打开的文件代码、工作目录和资源限制。子进程从父进程继承下列属性: 1、实际用户号、有效用户号以及保留的用户号。 2、 实际组号、有效组号以及保留的组号。 3、 补充组号列表。 4、 进程组号。 5、 环境。 6、 文件描述符。 7、 执行时关闭标志。 8、 信号处理设置。 9、 信号掩码。 10、 配置处理开/关状态。 11、 所有连接的共享内存段。 12、 当前工作目录。 13、 根目录。 14、 文件模式创建掩码。 15、 文件大小限制。 16、 实时优先级。,Fork说

12、明,每个子进程的文件描述符与对应的父进程的文件描述符共享一个打开文件的文件描述符。这意味着对父进程中文件描述符的文件地址偏移量、文件访问模式以及文件状态标志的更改也会影响它们在子进程中的状态,反之亦然。 子进程在下列方面与父进程不同: 1、子进程具有唯一的进程号。 2、 子进程号与任何活动的进程组号都不匹配。 3、 子进程具有不同的父进程号(父进程号是父进程的进程号)。 4、子 进程的未决信号集初始化为空集。 5、 子进程中的跟踪标志被清除。 6、 子进程中设置了记账记录的 ac_flags 组件中的 AFORK 标志。 7、 子进程不继承进程锁定、文本锁定和数据锁定。 8、 清除了所有 se

13、madj 值。 9、 子进程的 tms_utime 、tms_stime 、tms_cutime tms_cstime 的值被设置为零。 10、 报警时钟信号重置为 0(清除任何未决报警)之前所剩余的时间,以及所有间隔计章时器都设置为 0(禁用)。,fork实例(1),Int main(void) fork();printf(“Will be executed twicen”);return 0; rootlocalhost # ./fork Will be executed twice Will be executed twice,fork实例(2),int main(void) pid_t

14、 pid; if(pid=fork()=-1) /创建子进程 printf(“fork error“); else if(pid=0) /子进程中运行的代码 printf(“in the child processn“); else/父进程运行的代码 printf(“in the parent processn“); return 0; rootlocalhost # ./fork_example02 / 执行 in the child process in the parent process,fork实例(3),fork 函数创建子进程后,子进程将复制父进程的数据段、BSS 段、代码段、堆

15、空间和栈 空间,对于文件描述符则是以共享的方式使用的。在下面的实例中可以看出,父子进程对于 各自的变量维持不同的变量(复制), 而对文件描述符信息则是共享使用的,而且,对于文件的偏移量也是共享的。,fork实例(3),int main(int argc,char *argv) pid_t pid; int fd; int i=1; int status; char *ch1=“hello“; char *ch2=“world“; char *ch3=“IN“; if(fd=open(“test.txt“,O_RDWR|O_CREAT,0644)=-1) /打开(创建)一个文件 perror(“

16、parent open“); exit(EXIT_FAILURE); if(write(fd,ch1,strlen(ch1)=-1) /父进程向文件中写入数据 perror(“parent write“); exit(EXIT_FAILURE); if(pid=fork()=-1)/创建新进程 perror(“fork“); exit(EXIT_FAILURE); ,fork实例(3),else if(pid=0) /子进程 i=2; printf(“in childn“); /打印 i 值,以示与父亲进程区别 printf(“i=%dn“,i); if(write(fd,ch2,strlen

17、(ch2)=-1)/写文件 test.txt,与父进程共享 perror(“child write“); return 0; else /父进程 sleep(1); /等待子进程先执行 printf(“in parentn“); printf(“i=%dn“,i); /打印 i 值,以示与子进程区别 if(write(fd,ch3,strlen(ch3)=-1) /写操作,结果添加到文件后 perror(“parent,write“); wait( ,fork实例(3),rootmichael root# ./fork_descriptor 运行 in child i=2 in parent

18、i=1 rootmichael root# cat test.txt helloworldIN /顺序写入 hello、world、IN 在程序对文件描述符操作中,父进程首先打开(创建)文件 test.txt 文件,然后向该文件中写入 ch1(hello)内容,然后父进程等待 1 秒让子进程完成写 ch2(world)操作,1 秒后父进程再次写入数据 ch3(IN)。由文件 test.txt 内容可以看出,父子进程共同对一个文件操作,且写入数据不交叉覆盖,说明父子进程共享文件偏移。 对于变量 i,在子进程进行了第 2 次赋值(i=2),其结果为 2,而父进程中 i 的值不变,说明,父子进程各子

19、拥有这一变量的副本,互相不影响。,Vfork函数,使用fork()父进程创建子进程时,子进程将复制父进程的相关信息。vfork() 是高性能版的 fork(),它在某些可获得性能优势的系统上提供。 vfork()创建新进程时无需完全复制父进程的地址空间。 而是父子进程共享虚拟内存空间。它的实现类似于fork函数。,Fork与vfork的区别,Fork函数在创建新的子进程时候会复制所有父进程所拥有的资源。很多时候复制所有父进程的资源是多余的操作。 Vfork函数调用不会复制父进程的相关资源,父子进程将共享地址空间。子进程对虚拟内存空间的任何修改实际上是在修改父进程虚拟内存空间的内容。在使用vfo

20、rk函数创建子进程后,父进程会阻塞,直到子进程调用了_exit函数退出。子进程不能使用return返回或调用exit函数,可以调用_exit函数。,Vfork,vfork函数声明为: extern _pid_t vfork (void) vfork() 在子进程环境中返回 0,在父进程环境中返回子进程的进程号,Vfork实例,int glob=6; int main() int var; pid_t pid; var=88; printf(“in beginning:tglob=%dtvar=%dn“,glob,var); /打印全局变量 glob,局部变量 var 初始值 if(pid=vf

21、ork() perror(“vfork”); exit(EXIT_FAILURE); else if(pid=0) /子进程中 printf(“in child,modify the var:glob+,var+n”); glob+; /子进程中修改全局变量 var+; /子进程中修改局部变量 printf(“in child:tglob=%dtvar=%dn”,glob,var); _exit(0); /使用_exit()退出 else /父进程打印两变量值 printf(“in parent:tglob=%dtvar=%dn“,glob,var); return 0; ,Vfork实例,rootlocalhost # ./vfork_fork_example01in beginning: glob=6 var=88 /初始 in child,modify the var:glob+,var+ in child: glob=7 var=89 /子进程修改后 in parent: glob=7 var=89 /父进程跟着被修改,说明两者共享,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报