linux命令基础-课件1教学系统编程_第1页
linux命令基础-课件1教学系统编程_第2页
linux命令基础-课件1教学系统编程_第3页
linux命令基础-课件1教学系统编程_第4页
linux命令基础-课件1教学系统编程_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

进程相关概程序和进 程序→剧本(纸 进程→戏(舞台、演员、灯光、bashID并分时复用单道程序设多道程序设时钟中断放弃cpu。因此系统需要一种强制让进程让出cpu资源的。时钟中断有硬件基础作为保障,对进程而言不可抗拒。操作系统中的中断处理函数,来负责调度程序执行。在多道程序设计模型中,多个进程轮流使用CPU(分时复用CPU资源)。而当下常见CPU为纳秒级,110亿条指令。由于人眼的反应速度是毫秒级,所以看似同时1s=1000ms,1ms=1000us,1us=实质上,并发是宏观并行,微观串行 推动了计算机蓬勃发展,将人引入了多时代CPUMMU(了解处理器内存管理单元进程控制块task_struct结构体。/usr/src/linux-headers-3.16.0-30/include/linux/sched.hstructididCpid_t类型表示,其实就是一个CPU当前工 DirectoryumaskfileididLimit进程状环境变量:(了解(本质)=值[:值]形式:与命令行参数类似。char*[]数组,数组名environ,内部字符串,NULLstack的起始位置。引入环境变量表:须环境变量。externchar**environ;

常见环境变name=valuename由大写字母加name的部分叫做环境变量,value的部分则是环境变量的值。环境变ls/bin/ls,然而通常我们执行当前a.out却需要提供完整的路径名./a.outPATHls命令所在的/bina.out所在的。PATH环境变量的值可以包含多个:Secho$echoS当前 语言和 在getenvsetenv函intsetenv(constchar*nameconstchar*value,int 1overwrite取值:1unsetenv函nameintunsetenv(constchar*name);成功:0;失败:-注意事项:name0(成功)name命名为"ABC="进程控fork函pid_tfork(void); 失败返回-1;成功返回:①父进程返回子进程的ID(非负) 子进程返回0init1)循环创n个子进forkN个子进程应该怎样实现呢?简单想,for(i=0;i<n;i++){fork()}N个子进程吗?循环创建Nn3时候,循环创建了(2^n)-1个子进程,而不是break;才正确。1S打印自己是第几个被创101212323#include<stdio.h>#include<stdlib.h>#includeint{inti;pid_tpid;for(i=0;i<5;i++)pid=fork();if(pid==0)}}if(i<5)printf("I'am%dchild,pid=%u\n",i+1,} printf("I'm}return}通过该练习掌握框架nigetpid函pid_tgetppid函pid_tgetppid(void);②是否内核数据结②是否外部硬件资 二者有任一→系统函数;二者均无→库函getuid函数(了解uid_tgetuid(void);uid_tgeteuid(void);getgid函数(了解gid_tgetgid(void);gid_tgetegid(void);进程共fork后。有哪些相同,那些相异之处呢?fork之后:父子相同处:全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主 父子不同处:1.进程ID 2.fork返回值 3.父进程ID 似乎,子进程了父进程0-3G用户空间内容,以及父进程的PCB,但pid不同。真的fork0-3G地址空间完全拷贝一份,然后在映射至物理内存吗?当然不是!父子进程间遵循读时共享写时的原则。这样设计,无论子进程执行父进#include<stdio.h>#include<stdlib.h>#includeinta= int{pid_tpid;pid=fork();if(pid==0){ a=2000;printf("child,a=%d\n",}elsesleep(1);//sonprintf("parent,a=%d\n",}return}【重点:父子进程共享:1.文件描述符(打开文件的结构体 2.mmap建立的映射exec函数fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的exec并不创execid并未改变。ID不变,换核不换壳。execexecintexecl(constchar*path,constchar*arg,intexeclp(constchar*file,constchar*arg,intexecle(constchar*path,constchar*arg,...,char*constenvp[]);intexecv(constchar*path,char*constargv[]);intexecvp(constchar*file,char*constintexecve(constchar*path,char*constargv[],char*constexeclp函intexeclp(constchar*fileconstchar*arg, 成功:无返回;失败:- 搜索后没有参数1则出错返回。该函数通常用来调用系统程序。如:ls、date、cp、catexecl函+intexecl(constchar*path,constchar*arg,...); execlp,如加载"ls"命令带有-l,-F参数execlp("ls","ls",l",F" execl("/bin/ls","lsl",F" 1intexecvp(constchar*file,constchar变参形式:①...②argv[] (main函数也是变参函数,形式上等同于intmain(intargc,char*argv0,...))NULLexecvpexeclp#include<unistd.h>#include<fcntl.h>#include<stdio.h>#includeint{intif(fd<0){perror("openps.outerror");}dup2(fd,execlp("ps","ps","ax",return}exec函数族一般规律(了解execperror()exit()if判断。l p filepathv e(environment) man2man3exec回收子进孤儿进孤儿进程:init//orphan.c孤儿进程演示#include<stdio.h>#include<unistd.h>#include<sys/wait.h>int{pid_tpid;pid=fork();if(pid==0)while(1)printf("Iamchild,myparentpid=%d\n",getppid());}}elseif(pid>0)printf("Iamparent,mypidis=%d\n",getpid());printf("------------parentgoingto }elsereturn1;}return}僵尸进【zoomcwait函S中用特殊变量$?SSwaitwaitpid得到它的退出状wait(退出原因)pid_twait(int*status);ID;失败:-1没有子进程当进程终止时,操作系统的隐式回收机制会:1.关闭所有文件描述符2.PCB仍存在。其中保存该进程的退出状态。(正常终止→退出值;异常waitstatus来保存进程的退出状态。借助宏函数来进一步判断进WIFEXITED(status)为非 →进程正常结WEXITSTATUS(status)(exit的参数WIFSIGNALED(status)0WTERMSIG(st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论