《进程与信号.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《进程与信号

它们控制了LINUX系统几乎所有的活动。 LINUX环境中进程如何被处理,如何准确地发现计算机在干什么,怎样启动或停止其他的进程,怎么使进程收发消息,如何避免僵尸进程?在这一章都会给出答案。 特别地,我们需要了解: 1.进程结构,类型和调度;2.开始新的进程的不同方式;3.父,子,僵尸进程;4.什么是信号,如何被使用。 进程:是一个地址空间,带着若干个同时运行的线程,以及这些线程所需要的资源。 多任务操作系统会让许多程序一起跑,每个程序就构成1个进程。 进程结构 每个进程会被分配一个唯一的标识符 PID (范围 2--32768, init进程就是1) #include int getpid(void);? ?//取得当前进程的PID int 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 Process fork失败,会返回-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)

1983xuesheng + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档