- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6.1 linux进程和线程编程
6.1 进程 6.1.1Linux 进程环境 Linux shell启动程序 Shell本身可以运行两种文件,一种是二进制文件,另一种是解释器文件(shell脚本)。 $ 程序路径 命令参数(例如hello) 程序运行时会在指定的路径下搜索文件,如果存在则shell会使用加载程序将这些文件加载到内存中。否则提示执行失败。 Linux shell中的命令也是一些可以执行的二进制文件,他们存放在$PATH路径指定的文件夹下,用户可以自己定义自己的命令,放置在$PATH指定的目录中,则可以像执行命令一样执行自己的程序。 Linux 加载一个程序 一个源程序代码,进过编译、链接之后加载到内存中执行,下面介绍3个概念:程序格式、内部结构、程序头。 程序格式:程序在经过编译后变成了二进制代码,但是并不是每个程序的内部结构都是一样的,同一类程序使用同样的内部结构,他们的内部结构采用相同的套路,这种类称之为格式。 内部结构:一个C程序可能被编译成若干个段,这若干个段是linux下c的典型段,单并不是所有的段,有些格式的程序,可能段多,有些可能段少,此外段的顺序可能也不相同,程序段的数目和顺序成为程序的存储结构。 程序头:一个程序需要一个独立的单元记录一些统计信息,这些信息包括二进制代码段的大小,段的次序,操作系统在加载程序时,需要程序头提供信息,分配供程序运行的内存等。 Linux 加载一个程序 加载地址 了解加载过程后,可以得出一个结论,就是加载器每次加载前需要分配地址空间,所以每次加载程序时不会使用相同的地址。 退出程序 对于退出程序的理解有助于在以后的编程中防止很多错误发生, 在linux环境中,退出有3种形式,进程自愿退出,进程收到一个信息号退出,以及进程执行一个导致异常的操作后退出。 自愿退出:这种一般为return和exit语句,进程退出时系统要回收进程所分配的资源,例如进程的地址空间、文件描述符等,在回收资源的同时,操作系统要对每一项资源进行善后处理,例如对于打开的文件,在释放文件描述如的同时还要将缓冲区的内容“冲洗”到外存中保证文件缓冲区中的内容和外存一致。 一个进程的资源分为两部分,一部分资源在进程结束就会释放,另一部分则由系统保存,用于以后对进程进行统计,前者往往供进程本身使用,后者往往提供给进程的父进程,因此,用于统计的资源是否释放是由进程的父进程决定的,如果父进程不释放进程资源,则会出现僵尸进程,由此可见进程正常退出后,出了操作系统所作的资源释放外,父进程释放掉进程的统计资源也是相当重要的。 程序退出流程 退出程序 退出进程的第二种情况是收到一个信号后退出吗,这种情况往往出现在父进程对子进程的控制上,例如:在shell中如果不想让其执行,可以按Ctrl+C强行终止一个程序执行,这一操作实际上是是由shell(父进程),向运行的程序发出了一个终止信号,子进程在收到信号后,也会想自愿退出一样处理分配资源,正常退出。 第3中情况,是在预料之外退出的,程序没有准备好,这时候操作系统也会对其资源进行回收,但是有可能不会对这些资源做善后处理,这样的退出方式称为异常退出。 进程终止处理函数 Linux环境下允许在进程推出的时候调用一些用户自定义函数,这些函数称为终止函数。 Linux规定最多可以设置32个这样的进程终止函数。Linux使用atexit函数设置进程终止处理函数,其原型如下: #includestdlib.h Int atexit(void (*func)(void)); Atexit函数的参数是一个函数指针。该函数指针指向一个返回值和参数都是void型的函数,也就是说,进程终止函数不接受任何参数,因为他是在进程结束时调用的,因此也不返回任何值。如果成功的设置了进程终止处理函数,atexit函数返回0,失败则返回非零值。因此在检查atexit的返回值时,不应检查atexit的返回值是否为-1.进程终止函数处理的调用顺序与设置时相反。 perror (s )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 错误 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。 进程终止处理函数 第二次设置的进程终止处理函数f1 Linux 进程内存管理-数据内部存储 内存是计算机的敏感资源,熟练掌握对内存的操作是一个程序员的必备素质。 数据的内部存储方式:大小端法 在c中,不同的数据类型占用的空间是不同的,例如char类型占用1个字节,而int占用4个字节 数据内部存储 存储其中的大小端法存储是是由处理器决定的和linux系统无关,下面的代码展示了如何判断读者使用的机器是使用那种存储方式。该程序首先定义了一个整形
文档评论(0)