第十章 系统调用.pptVIP

  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文档。上传文档
查看更多
第十章 系统调用

第十章 系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。 从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。 优点: 使编程更加容易; 提高了系统的安全性; 提高了程序的可移植性。 联系: (1)API有可能和系统调用的调用形式一致; 如:read(); (2) API和系统调用关注的都是函数名、参数类型及返回代码的含义; (3)一个API函数有可能调用多个系统调用,有可能不调用系统调用(如:abs()),或者几个API函数有可能均调用了同一个系统调用(如:malloc( ),calloc( ),free( )均调用了brk( ))。 联系: (1)系统命令相对应用编程接口更高一层,每个系统命令都是一个可执行程序,比如ls、hostname等; (2)系统命令的实现调用了系统调用,可通过“strace 命令名”查看 。 内核函数定义:内核函数在形式上与普通函数一 样,但它是在内核实现的,需要满足一些内核编 程的要求 。 系统调用的进入可分为“用户程序调用系统调用处理程序(system_call)”和“系统调用处理程序调用各个服务例程”两部分,下面分两部分来说明: (1)Linux的系统调用使用第0x80号中断向量项作为总的入口,即系统调用处理程序的入口地址; (2)在系统调用处理程序中,通过语句 “call * SYMBOL_NAME(sys_call_table)(,%eax,4)”来调用各个服务程序。 每个系统调用至少有一个参数,即通过eax寄存器传递来的系统调用号; 系统调用处理程序的参数首先传递给系统调用处理程序在CPU中的寄存器,然后再复制到内核堆栈。 用寄存器传递参数必须满足两个条件: 每个参数的长度不能超过寄存器的长度 参数的个数不能超过6个(包括eax中传递的系统调用号),若多于6个,用一个单独的寄存器指向进程地址空间中这些参数值所在的一个内存区即可。 服务例程的返回值必须写到eax寄存器中。 1.实例: --系统调用time返回从格林尼治时间1970年1月1日 0:00开始到现在的秒数。 --大多数系统调用都在各种C语言函数库中有所实现,所以在一般情况下,都可以像调用普通的库函数那样调用系统调用。 #includetime.h #includestdio.h main() { time_t the_time; the_time=time((time_t *)0); //调用time系统调用 printf(The time is %ld\n,the_time); } 2.fork 在2.4.4版内核中,fork是第2号系统调用,它在Linux函数库中的原型是: #includesys/types.h // 提供类型pid_t的 定义 #includeunistd.h // 提供函数的定义 pid_t fork(void); fork系统调用的作用是复制一个进程。当一个进程调用它,完成后就出现两个几乎一模一样的进程,也由此得到了一个新进程。 3.exit 在2.4.x版内核中,exit是第1号调用,其在Linux函数库中的原型是: #includestdlib.h void exit(int status); 从exit的名字就能看出,这个系统调用是用来终止一个进程的。无论在程序中的什么位置,只要执行到exit系统调用,进程就会停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。 // exit_test1.c #includestdlib.h // #includeunistd.h #includestdio.h main() { printf(this process will exit!\n); exit(0); printf(never be displayed!\n); } 编译后运行: $gcc exit_test1.c -o exit_test $./exit_test1 this process will exit! 可以看到,程序并没有打印后面的never be displayed!\n,因为在此之前,在执行到exit(0)时,进程就已经终止了。 exit系统调用带有一个整数类型的参数 status,可以利用这个参数传递进程结束 时的状态,比如说,该进程是正常结束的 ,还是出现某种意外而结束的,一般来说 ,0表示

文档评论(0)

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

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

1亿VIP精品文档

相关文档