GNULinux平台的C程序开发及程序运行环境本文介绍在GNULinux.doc

GNULinux平台的C程序开发及程序运行环境本文介绍在GNULinux.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GNULinux平台的C程序开发及程序运行环境本文介绍在GNULinux.doc

GNU/Linux平台的C程序开发及程序运行环境 本文介绍在GNU/Linux环境下一个C程序由源代码到程序,到加载运行,最后终止的过程。同时以此过程为载体,介绍GNU/Linux平台下软件开发工具的使用。 ? 本文以我们最常见的hello, world!为例: ? #include stdio.h main () { ????? printf(“hello, world!\n”); }? ??? C程序生成 ? 下图是一个由C源代码转化为可执行文件的过程: ? 代码编辑: 比较流行的编辑器是GNU Emacs和vim。Emacs具有非常强大的功能,并且可扩展。 编译:包括编译预处理,编译,汇编,连接过程。它们都可以通过GCC来实现。关于GCC,可以参考我关于 HYPERLINK /u/13991/showart.php?id=96714 \t _blank GCC的笔记。 ? C编译器将源文件转换为目标文件,如果有多个目标文件,编译器还将它们与所需的库相连接,生成可执行模块。当程序执行时,操作系统将可执行模块拷贝到内存中的程序映象。 程序又是如何执行的呢?执行中的程序称之为进程。程序转化为进程的步骤如下: 1,? 内核将程序读入内存,为程序镜像分配内存空间。 2,? 内核为该进程分配进程标志符(PID)。 3,? 内核为该进程保存PID及相应的进程状态信息。 经过上述步骤,程序转变为进程,即可以被调度执行。 ? 上述的hello, world程序实际是不规范的,POSIX规定main函数的原型为: ? int main( int argc, char *argv[])? argc是命令行参数的个数,argv是一个指针数组,每个指针元素指向一个命令行参数。 ? e.g:? $ ./a.out arg1 arg2 argc = 4 argv[0] = ./a.out?? argv[1] = arg1? argv[2] = arg2? ?C程序的开始及终止 ? ??? 程序的运行: 唯一入口:exec函数族(包括execl, execv, execle, execve, execlp, execvp) 程序开始执行时,在调用main函数之前会运行C启动例程,该例程将命令行参数和环境变量从内核传递到main函数。 ? 程序的终止:有8种途径: 正常终止: 1,??? 从main返回。 2,??? 调用exit。 3,??? 调用_exit或_Exit。 4,??? 从最后一个线程的开始例程返回。 异常终止: 5,??? 调用abort。 6,??? 接收到一个终止信号。 7,??? 对最后一个线程发出的取消请求做出响应。 ? _exit与_Exit的区别??????? :前者由POSIX定义,后者由ISO C定义。 exit与_exit, _Exit的区别:前者在退出时会调用由用户定义的退出处理函数,而后两者直接退出. (关于退出处理函数atexit(), 参考APUE2, P182.) 另外, 调用exit()或_Exit()需要包含stdlib.h, 调用_exit()需要包含unistd.h. ??? 要退出程序,除了return只能在main中调用外,exit, _exit, _Exit可以在任意函数中调用。 在main函数最后调用return (0); 与调用exit (0)是等价的。 程序中调用exit时,exit首先调用注册的退出处理函数(通过atexit注册),然后关闭所有的文件流。 ? 在程序运行结束时,main函数会向调用它的父进程(shell)返回一个整数值,称之为返回状态。该数值由exit或return定义。如果没有显示地调用它们,程序还是会正常终止,但返回数值不确定(以前面的hello, world程序为例,返回值为13,实际上是printf函数的字符个数)。 $ gcc -Wall -o hello hello.c $ ./hello $ echo $????????????? (echo $? 用于在bash中查看子程序的返回值) 13 ?????????????????????????????????????????????????????????????????????? 程序映象 我们已经了解了一个可执行模块(executable module)是怎样由源代码生成的. 那么, 执行这个程序时, 又是怎样的情况呢? 下面介绍一个位于磁盘中的可执行程序是如何被执行的. (1) 程序被执行时, 操作系统将可执行模块拷贝到内存的程序映像(program image)中去. (2) 正在执行的程序实例被称为进程: 当操作系统向内核数据结构中添加了适当的信息, 并为运行程序

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档