- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《进程与信号
它们控制了LINUX系统几乎所有的活动。LINUX环境中进程如何被处理,如何准确地发现计算机在干什么,怎样启动或停止其他的进程,怎么使进程收发消息,如何避免僵尸进程?在这一章都会给出答案。特别地,我们需要了解:1.进程结构,类型和调度;2.开始新的进程的不同方式;3.父,子,僵尸进程;4.什么是信号,如何被使用。进程:是一个地址空间,带着若干个同时运行的线程,以及这些线程所需要的资源。多任务操作系统会让许多程序一起跑,每个程序就构成1个进程。进程结构每个进程会被分配一个唯一的标识符 PID (范围 2--32768, init进程就是1)#include int getpid(void);? ?//取得当前进程的PIDint getppid(void);??//取得当前进程的父进程的PID/proc目录下放了特定的进程文件LINUX系统有虚拟存储系统,可以把超出物理存储空间以外的进程装进物理内存空间。进程表$ps -af$ps -ax进程调度LINUX调度器基于优先级决定哪个进程该跑。高优先级的跑得更频繁,低优先级的会因为高优先级进程作好了准备而根本没法跑。启动新的进程1.system 函数2.exec 系列函数 :代替当前执行的线程int execv(const char* pathname, char *const argv[])3.fork 函数 复制新的进程在进程表中创建1个新的process entry,跑同样的代码,与当前进程有很多相同的属性,但是有自己的数据空间,环境和文件描述符。#include #include pid_t fork(void);Initial Process? ?? ?|Fork() ----------------------------? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |return a new PID? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? return 0? ?? ?|? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? |Original Process continue? ?? ?? ?? ?? ?? ?? ? New Processfork失败,会返回-1,这通常是由于子进程数量的限制CHILD_MAX,相应的errno是EAGAIN. 如果没有足够的空间资源,errno会是ENOMEM当fork被调用时,当前进程会分成2个进程,区分父进程的方式是返回非零值(即新创建的子进程的PID)。而子进程则是返回0。4.等待进程#include #include pid_t wait(int* stat_loc);wait会导致父进程阻塞,直到它的1个子进程结束或者父根本没有子进程。这个调用会返回该子进程的PID。如果有错误,返回-1,错误码保存在errno中。用宏WIFEXITED(stat_loc)判断子进程是否正常退出;用宏WEXITSTATUS(stat_loc)返回子进程的退出码。#include #include #include #include int main(){? ? pid_t pid;? ? char *message;? ? int n;? ? int exit_code;? ? printf(fork program starting\n);? ? pid = fork();? ? switch(pid)? ? {? ? case -1:? ?? ???perror(fork failed);? ?? ???return 1;? ? case 0:? ?? ???message = This is the child;? ?? ???n = 5;? ?? ???exit_code=37;? ?? ???break;? ? default:? ?? ???message = This is the parent;? ?? ???n = 3;? ?? ???exit_code=0;? ?? ???break;? ? }? ? for(; n 0; n--) {? ?? ???puts(message);? ?? ???sleep(1);? ? }? ? if(pid!=0){? ?? ???printf(child PID= %d\n, pid);? ?? ???int
文档评论(0)