- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
进程和程序
进程和程序 进程的系统数据 user结构和proc结构 进程的基本状态 进程的调度 系统调用 获取系统调用返回值 perror/strerror 系统调用举例 系统调用fork fork举例 命令ps 命令ps举例 访问环境参数的三种方法 exec系统调用 exec系统调用(续) wait系统调用 字符串库函数strtok 最简单的shell:xsh0 执行xsh0 * 程序 指令和数据的集合 存放在磁盘上的一个普通文件里 文件的i节点中标为可执行,内容符合系统要求 进程 包括指令段、用户数据段和系统数据段的执行环境 进程和程序的关系 程序用于初始化指令段和用户数据段 初始化后,进程和初始化它的程序之间无联系 进程运行时,它对应的磁盘上的程序文件不可修改/删除 几个同时运行的进程可以由同一程序初始化得到,进程之间没什么联系。核心通过安排这样的进程来共享指令段以节省内存,但这种安排对用户来说是透明的。 进程的系统数据PCB 在UNIX内核中,含有进程的属性,包括: 进程状态,优先级信息 核心堆栈 当前目录(记录了当前目录的i-节点),根目录 打开的文件描述符表 umask值 进程PID,PPID 进程主的实际UID/GID,有效UID/GID 进程组组号 user结构(约5000字节),sys/user.h proc结构(约300字节),sys/proc.h 进程运行时才需要的数据在user结构 其它信息存于proc结构 用户程序不能直接存取和修改进程的系统数据 系统调用可用来访问或修改这些属性 如: chdir, umask, open, close setpgrp, getpid, getppid 基本状态 进程创建之后,主要有运行状态和睡眠状态(也叫阻塞状态,等待状态,挂起状态,等等)。 在核心中,将运行状态和睡眠状态的程序组织成不同的队列,系统总是在分时处理运行状态的进程,而不顾那些处于睡眠状态的进程。 处于睡眠状态的进程,在条件满足后,转化为运行状态,进入运行状态进程的队列而被调度。 进程在睡眠时,不占用CPU时间 注意:在编程时,程序不要处于忙等待状态 调度优先级 UNIX核心,将可运行进程按优先级分成几个不同的队列,高优先级进程优先被调度执行。 可以用nice()系统调用调整进程的优先级 进程的优先级总在不停地发生变化 处于睡眠状态的进程一旦被叫醒后,被赋以高优先级,以保证人机会话操作和其它外设的响应速度。 UNIX中系统调用(system call)是UNIX内核与应用程序之间的唯一接口。 内核对外提供的所有的功能均以系统调用的方式出现,应用程序只有通过系统调用才能申请和访问硬件资源(内存和磁盘,I/O设备)和内核数据 进程不可直接读写I/O端口和接管硬件中断,必须要通过系统调用。 进程调用一次系统调用要导致CPU在用户态和核心态之间作一次切换,比在进程自己的地址空间中调用一个子例程要花费更长时间(所以UNIX中提供了文件缓冲I/0库程序) C程序员在使用系统调用和使用其它函数调用时,用法上没什么区别 函数返回值 UNIX的大多系统调用都返回一个整数值,如: open(), wrire(), read()等, 当返回值为-1时,表示系统调用执行失败,系统会填写变量errno errno C程序库中定义的全局性整数,说明失败的原因, errno可能的取值在sys/errno.h文件中定义了宏,如: EBADF, EINTR, ENOMSG等等。 对于某一系统调用,直接用man命令查阅联机手册, 得知系统调用失败时errno可能的取值及原因 sys_errlist 还有一个sys_errlist表,也可以直接引用,是错误代码对应的错误信息表 与系统调用执行失败有关的的函数: char *strerror(int errnum); void perror (char *s); perror会在stderr上产生一条消息,描述在系统调用或使用库函数(库函数中发出了系统调用)期间所遇到的最后一个错误。先印出字符串s,再印出一个冒号和空格,然后再印出这条消息和换行符 strerror()根据错误号,得到一个描述这一错误的字符串. 举例程序 执行时,如果文件打开失败(系统调用open),就给出一条信息,根据失败的原因不同,打印出的错误信息内容也不同,如:没有访问权限,文件不存在,等等。 #include sys/fcntl.h extern int errno; extern char *sys_errlist[]; void main(int argc, char **argv) { int fd; fd=open(argv[1],O_RDWR
文档评论(0)