南邮 Linux-第8章_第1页
南邮 Linux-第8章_第2页
南邮 Linux-第8章_第3页
南邮 Linux-第8章_第4页
南邮 Linux-第8章_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 Linux进程郑谦益、韩京宇8.1 Linux进程概述 略8.2 进程的地址空间 Linux内核运行在具有内存管理单元处理器上,每个进程都有独立的虚拟地址空间,空间的大小由地址总线宽度决定 。 (32位机)0-3G是用户虚拟地址空间,将可执行程序映射至该空间,该空间的代码运行在用户态。 3G-4G通常定义为Linux内核虚拟地址空间,将Linux内核映射至该空间,不同进程的内核虚拟地址空间是共享的,内核代码运行在内核态。8.3 进程的创建与终止 fork函数创建新的子进程时,内核将父进程的用户地址空间的内容拷贝给子进程 父子进程之间拥有各自独立的用户空间,当父进程修改变量的值时,不会影

2、响子进程中的相应变量 8.3 进程的创建与终止 pid_t fork(); 创建子进程 -1 错误返回 在子进程中返回0 在父进程中返回子进程的ID 注意:fork()系统调用有一个不同寻常的性质,它不是每次调用返回一次,而是两次:一次在父进程;一次在子进程。8.3 进程的创建与终止intglob = 10;int main(void) int local;pid_t pid;local = 8;if (pid = fork() = 0) / 子进程子进程sleep(2); else glob+; local-; sleep(10);printf(pid = %d, glob = %d, lo

3、calar = %dn, getpid(), glob, local);exit (0); 8.3 进程的创建与终止 C程序从main函数处开始运行, 实际上,加载可执行文件后,首先运行的是称为start-up的代码,这部分代码在程序链接为可执行程序时,由链接器器加入,其目的是从内核读取进程运行所需的环境信息。例如,环境变量和命令行参数等,start-up在完成一系列初始化工作后,调用main函数 最后,在执行完进程后,通过调用exit函数结束进程,其流程如图8-5所示。8.3 进程的创建与终止 在Linux系统中,每个进程都有父进程,当子进程运行结束后,子进程进入僵尸状态,并向父进程发送SI

4、GCHLD信号,通知子进程已经终止。 在该状态下几乎释放了所有的内存资源,不能被重新调度,仅在进程列表中保留一个位置,只保留进程如何终止的一些状态信息,以供回收者使用。 由父进程释放子进程余下的所有资源。但当父进程在子进程之前终止,子进程的父进程将更改为init进程,由init进程负责它的善后处理工作。 8.3 进程的创建与终止 void exit(int status); 终止进程 由系统默认调用8.3 进程的创建与终止 int atexit(void (* func) (void) ; 功能:登记终止处理程序 参数: 终止处理函数 成功,则为0,否则,返回非0 参见程序888.4 加载可执

5、行映像 子进程在创建时,继承了父进程的资源,父子进程可并发运行,它们由同一代码流程控制,具有相似的行为。 如果希望子进程具有自身独立的代码流程,这可通过加载可执行二进制映像文件来实现,内核通过exec系统调用在进程中建立新的运行环境。8.4 加载可执行映像 自学例子(pp.170-172)8.5 进程同步控制 当创建一个子进程后,父子进程的执行顺序无法控制,当父子进程同时操作共享资源时,不同的执行次序有可能导致不同的运行结果,从而出现数据的不一致性 。 wait和waitpid函数都用于等待子进程的结束,当进程结束后,进程将释放大部分的资源,只保存结束状态等信息,向父进程发送消息,并进入僵死状

6、态,等待父进程读取子进程的状态信息,释放剩余资源。8.6 进程环境 实际用户和实际用户组实际用户和实际用户组 在Linux系统中,同一个程序可由不同用户运行产生进程,为了反映进程的运行环境,在进程控制块中标识了实际用户和实际用户组。实际用户指的是运行该进程的登录用户;实际用户组则是运行该进程的登录用户所属的主用户组。8.6 进程环境 有效用户和有效用户组有效用户和有效用户组 通常,有效用户等于实际用户,有效用户组等于实际用户组 用户在运行一些特殊程序时,例如,passwd命令,用于修改用户的密码,但普通用户无权运行和修改passwd文件,为了解决这一问题,可让用户临时扮演passwd文件属主用

7、户的角色,这样,才有权修改密码文件,此时,实际用户与有效用户就不同了,实际用户为登录用户,而有效用户为passwd文件的属主用户;同样,可使用户临时扮演其他某用户组中用户的角色,以实现对特定资源的访问。8.6 进程环境 pid_t getuid(void) 获得当前进程实际用户ID 返回当前进程实际用户ID 8.6 进程环境 pid_t geteuid(void) 获得当前进程有效用户ID 返回当前进程有效用户ID 8.6 进程环境 pid_t getgid(void) 获得当前进程实际用户组ID 返回当前进程实际用户组ID 8.6 进程环境 pid_t gettegid(void) 获得当前

8、进程有效用户组ID 返回当前进程有效用户组ID 8.6 进程环境 int main(void) printf(My real user ID is %5ldn, (long) getuid(); printf(My effective user ID is %5ldn, (long) geteuid(); printf(My real group ID is %5ldn, (long) getgid(); printf(My effective group ID is %5ldn, (long)getuid(); return 0; 8.6 进程环境 父子进程父子进程 每个进程都有一个ID作为

9、标识,不同进程的ID不同,每个进程都有一个父进程ID,用于标识进程的创建者。 当父进程由于某种原因先于子进程结束,则子进程将变为孤儿进程,此时,子进程由养父init进程进行管理。 进程和进程组的ID一旦分配就不能改变。8.6 进程环境 函数原型pid_t getpid(void) 功能:获得当前进程ID 参数:无 返回值:返回当前进程ID 函数原型pid_t getppid(void) 功能:获得父进程ID 参数:无 返回值:返回父进程ID8.6 进程环境int main() printf(%d s parent process id: %dn,getpid(), getppid();if (

10、 fork()=0) printf(%d s parent process id: %dn,getpid(), getppid(); else printf(%d s parent process id: %dn,getpid(), getppid(); 程序8-24的一次运行结果如下所示:1599 s parent process id: 14641600 s parent process id: 15991599 s parent process id: 14648.6 进程环境 进程组进程组 有时,为了完成某项工作,需要有多个进程参与协同,例如: 在Shell下执行a | b | c |

11、 d,此时,Shell将产生4个子进程,如果在执行过程中,键入Ctrl+C结束运行,系统应将信号SIGINT发送给这4个进程。因此,为了便于管理,为这4个进程定义一个进程组,这样,信号SIGINT只要发送给这个进程组即可。一个进程组包含一个以上的进程,这些进程中可以有一个领头进程,其进程ID等于进程组ID,进程组的生命周期与领头进程的结束与否无关,当进程组中不包含进程时,进程组自动消失。8.6 进程环境 进程组与控制终端进程组与控制终端 当用户登录系统,Shell开始运行,此时,Shell拥有对终端的控制权,Shell成为控制进程,当Shell执行一个前台命令时,首先,Shell创建一个子进程

12、,为其定义不同的进程组,然后加载命令,并使其拥有终端的控制权,在终端上产生的所有信号都被送给前台进程,而不是其父进程Shell;当前台进程运行结束,原来的父进程Shell将重新获得对终端的控制权。 当Shell执行一个后台进程,首先,Shell创建一个子进程,为其定义不同的进程组,然后,在子进程中加载命令,但不将终端控制权传递给子进程。此时,在终端上产生的所有信号,将发送给其父进程Shell,如果后台进程试图从终端读取数据,它将产生信号SIGTTIN,同时暂停。8.6 进程环境 函数原型函数原型pid_t getpgrp(void) 功能:获得当前进程所属进程组ID参数:无返回值返回值:返回当

13、前进程所属进程组返回当前进程所属进程组ID 函数原型函数原型int setpgrp(void)pid_t setpgid( pid_t pid, pid_t pgrpId) 功能功能:设置进程组设置进程组ID参数参数pid 进程进程IDpgrpId 进程组进程组ID 返回值返回值:成功,返回进程组成功,返回进程组ID,否则,返回,否则,返回-18.6 进程环境 会话会话 会话用于标识用户登录的每一个终端,每个登录终端都有一个会话ID与其对应;用户可在登录的终端上输入多个命令,产生多个进程组,登录终端上所有进程组中的进程都拥有同一个会话ID, 如果调用setsid函数的进程不是进程组中的领头进程

14、,则可建立新的会话,该进程成为领头会话,同时产生一个新的进程组,且该进程为新进程组的领头进程,但不拥有终端。8.6 进程环境 守护进程守护进程 守护进程是一种运行于后台,且不受任何终端影响的进程,因此,需要关闭标准输入、标准输出和标准错误输出的文件描述符。 通常,守护进程以服务进程的形式存在,例如,Web服务器和邮件服务器等。同时要使守护进程脱离用户环境,所以,需将工作目录修改为系统工作目录。8.6 进程环境 创建守护进程的步骤创建守护进程的步骤 1. 创建子进程后结束父进程。 2.在子进程中建立新的领头会话。 3.修改工作目录和权限掩码信息。 4. 关闭文件描述符0、1和2。8.6 进程环境Int daemon_init(void)pid_tpid;if ( (pid = fork() 0)return(-1);else if (pid != 0)exit(0);/结束父进程结束父进程setsid();/创建领头会话创建领头会话system(cd /);/改变工作目录改变工作目录umask(0);/清除权

温馨提示

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

评论

0/150

提交评论