最新Unix程序设计基础 第二讲.pptVIP

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

进程ID与进程间的关系 UNIX系统中所有进程都有一个唯一的,称为进程标识的正整数与之相联,称为进程ID,简称PID。 除了init进程(PID=1,所有进程的祖先),任一进程都有唯一的父进程。 若干进程可以属于一个进程组,进程组也有一个唯一进程组ID。 * hhjkl Unix下的多进程编程 分三个部分 1、进程控制 2、信号处理 3、进程间通信(IPC) * hhjkl 进程控制 进程创建fork 函数原型: #include unistd.h pid_t fork(void); UNIX下最优美的函数。 pid_t是一个unisigned int,是进程号对应的数据类型 * hhjkl 进程创建 “fork”的意思就是一分为二,把当前进程复制出一个新的进程。当前的进程就是新进程的父进程,新进程称为子进程。 fork把子进程ID返回给父进程,把0返回给子进程,通过对返回值的检查就可知道当前是父进程还是子进程。看看下面的例子就明白我在说什么。 * hhjkl #include unistd.h #include stdlib.h #include stdio.h int main(void) { pid_t pid; if ((pid = fork()) 0) printf(“I am the parent, my pid = %u, my child’s pid = %u\n”, getpid(), pid); else if (pid == 0) printf(“I am the child, my pid = %u, my parent’s pid = %u\n”, getpid(), getppid()); else { perror(“fork”); return 1; } return 0; } * 进程创建 一般结构: if ((pid = fork()) 0) parent’s code; else if (pid == 0) child’s code; else error handling; 父进程打开的文件描述字将被子进程继承。 * hhjkl 进程创建 获得当前进程id: getpid 获得父进程id: getppid 函数原型: #include unistd.h pid_t getpid(void); pid_t getppid(void); * hhjkl 执行一个新程序 执行程序系统调用execve 函数原型: #include unistd.h int execve(const char *path, const char *argv[], const char *envp[]); Unix还提供其它几个执行程序函数,execl,execlp,execle,execv,execvp都不是系统调用,依赖于execve。 * hhjkl 执行一个新程序 path,执行的文件 argv,参数表 envp,环境变量表,一般直接用environ就行 如: char *argv[] = {“gcc”, “-g”, “-c”, “rbtree.c”, NULL}; execve(“/usr/bin/gcc”, argv, environ); * hhjkl 执行一个新程序 execve启动一个新的程序,新的地址空间完全覆盖当前进程的地址空间,但当前进程把开的文件描述字(除非特别设置),当前工作目录等将被继承。 execve只返回负值表示调用失败,如果成功的话将永不返回。 * hhjkl shell执行程序的原理 敲入命令: $ ps shell进程到底做了什么事? 1、等待用户输入 (等待I/O,睡眠状态) 2、获得输入ps 3、fork();子进程把自己放到前台,并调用execve(“ps”, …);父进程把子进程放入前台,并等待子进程结束(父进程进入睡眠状态 ) 4、子进程结束,父进程得到子进程的结束状态信息,并把自己放到前台,回到1。 * hhjkl shell执行程序的原理 由此可以看出,进程被创建的原因是因为fork被调用,而execve只是把当前进前的地址空间替换成新程序的地址空间。因此,不能说“进程是程序的一次执行”,“程序的执行”只是地址空间的替换。 思考: 在3中为什么既要父进程把子进程放到前台,又要子进程把自己放到前台? 有兴趣的话可以自己编写一个shell。 * hhjkl

文档评论(0)

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

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

1亿VIP精品文档

相关文档