- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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) 正在执行的程序实例被称为进程: 当操作系统向内核数据结构中添加了适当的信息, 并为运行程序
您可能关注的文档
- 7-5数据记录文件.ppt
- 7.1.1抽象方法-Read.ppt
- 7.1创建数据窗口对象-Read.ppt
- 7.3分区存储管理.ppt
- 7.6用Matrix(LIB)C++库实现图像变换的VC++编程.ppt
- 7.文字、点阵图与物件编辑.ppt
- 780px300px,背景颜色#B0DC9F,居中对齐.ppt
- 7月18日上午-科学网—博客.ppt
- 7月份讲座预告(表格).doc-厦门图书馆.doc
- 7树和森林.ppt.ppt
- 2020年药事管理与法规题解析 .pdf
- 2017-2021年中国高速公路行业现状及发展趋势分析 .pdf
- 2012年电力工业发展报告 .pdf
- 贵州省贵阳市某区2022-2023学年八年级上学期期末语文试题(原卷版).docx
- 河北省沧州市2022-2023学年八年级上学期期末语文试题(解析版).docx
- 海南省省直辖县级行政单位2022-2023学年八年级上学期期末语文试题(原卷版).docx
- 海南省东方市2022-2023学年九年级上学期期末语文试题(原卷版).docx
- 河北省邯郸市锦玉中学2022-2023学年八年级上学期期末语文试题(解析版).docx
- 海南省海口市(部分校)2022-2023学年八年级上学期期末语文试题(A)(原卷版).docx
- 河北省保定市第十七中学2022-2023学年八年级上学期期末语文试题(原卷版).docx
文档评论(0)