第5单元 进程控制及进程关系.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5单元 进程控制及进程关系

* exec注意 exec对打开文件的处理 默认情况下,exec后,新程序代码中可以使用原来代码中打开的文件描述符。 如果对文件描述符设置了fcntl(fd,F_SETFD,FD_CLOEXEC);则执行exec族函数后将关闭原进程打开的文件描述符。 exec后对opendir打开的目录将关闭 exec后进程的实际用户ID和实际组ID不变,而有效用户ID和有效组ID要根据新程序文件的设置用户ID和设置组ID位是否设置而定。 exec族函数之间的关系 只有execve是系统调用,其他都是库函数,最终都要调用execve。 P191,程序8-8,程序8-9 * * 第5单元 进程控制及进程关系 5.1 进程标识符 5.2 fork及vfork 5.3 exit 5.4 wait和waitpid 5.5 exec函数 5.6 system函数 5.7 进程组 5.8 会话 5.9 控制终端 system函数 P200 用于在程序中执行一个Shell命令 int system(const char *cmdstring); 参数是命令字符串 原理:创建子进程、子进程执行shell程序执行命令、父进程等待子进程结束。 返回值:由于system函数实现中涉及fork、exec、waitpid函数和调用shell程序,因此返回值较多 如果fork失败或waitpid返回除EINTR之外的错误,返回-1,置errno 如果exec失败,返回127 三个函数都成功,返回值是shell的终止状态。 程序8-12 * * 第5单元 进程控制及进程关系 5.1 进程标识符 5.2 fork及vfork 5.3 exit 5.4 wait和waitpid 5.5 exec函数 5.6 system函数 5.7 进程组 5.8 会话 5.9 控制终端 * 进程组 每个进程都属于一个进程组,进程组号为PGID 进程组是一个或多个进程的集合。 创建进程组的进程称为进程组长。 进程组ID与进程组长ID相同。 pid_t getpgrp(void); 进程组生命周期从创建直至该组中最后一个进程离开进程组。进程组存在与其组长终止与否无关。 进程可以通过setpgid函数加入一个现有进程组或创建一个新进程组。 * 会话 会话是一个或多个进程组的集合,会话ID(pid_t)。 getsid获取会话ID 每个进程都会属于一个进程组,每个进程组也都会属于一个会话。 * 会话 会话是由进程通过setsid创建。 创建会话的进程也是会话中一个进程组长,也是会话首进程。 会话ID、进程组ID都与这个进程ID相同 一个会话中可有多个后台进程组,最多只有一个前台进程组。 通常终端产生的信号(ctrl+c、ctrl+z)传给前台进程组 控制终端 终端登录 字符终端、图形终端 网络登录 登录时自动建立控制终端,进程通过控制终端进行输入,输出和控制作业的运行。 每个会话可以有、也可以没有控制终端,如果有控制终端,则会话中有一个前台进程组。 会话首进程负责控制终端的建立与控制,因此,会话首进程也称为控制进程。 * * 第5单元 小结 进程概念、进程标识符 pid,ppid,uid,euid,gid,egid fork/vfork、exit、wait和waitpid、exec族函数 system函数 进程组、会话、控制终端 实践 实验:实现简单的Shell,能调用外部命令的功能,调用的外部命令可以加参数。 外部命令,具有独立可执行程序的命令,如ls,ps等 Shell如何执行程序 Shell进程不断进行一个循环,直到用户输入exit或logout。 获取用户输入信息,并解析成各个独立的命令行参数字符串。 创建一个新进程来运行可执行文件对应的程序 等待该程序运行结束 * * 每个进程在内核中有个内核堆栈,共占2页,也就是8192个字节,在这堆栈底部,是该进程的struct task_struct结构。所以我们在内核中使用current就可以访问到该进程的struct task_struct。 内核为新建进程创建task_struct结构时,共分配了两个连续的页面,即8K的大小,并将底部约1k的大小用于task_struct(如#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))),而其余部分内存用于系统空间的堆栈空间,即当从用户空间转入系统空间时,堆栈指针esp变成了(alloc_task_struct()+8192),这也是为什么系统空间通常用宏定义current(参看其实现)获取当前进程的task_struct地址的原因。 在

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档