linux下C程序执行过程

来源:互联网 发布:firewallcmd 开放端口 编辑:程序博客网 时间:2024/06/05 09:33

声明:本人正在研读UNIX环境高级编程,相关博文为学习心得,观点可能会有错误,若那位大神发现错误,请留言指正,不胜感激。

main函数和应用程序

    在编写C应用时,都是以main()作为入口,这只是代码编辑时的情况。当使用C编译器编译后,编译器会在main()之前链接一段可执行的start-up启动代码。(此段代码由编译器自动链接,我们自己不用编写或修改,个人猜测此start-up代码段与编译器的配置,操作系统相关)。其过程如下图所示,最左侧为我们自己编写的C代码,通过C编译器编译后,生成的应用程序已经不仅仅由main()函数了,还包括启动代码,如果没有此段启动代码,我们编写的main代码将无法被执行。start-up是使用汇编语言编写的,但其功能可以用C代码表示为如下。负责启动一个调用main(),启动main(),当main()返回后,main的返回值作为exit的参数,来处理进程销毁任务。


start-up routine的功能

    start-up从kernel中获取用户在打开应用程序,由shell创建一个新进程时,指定的命令行参数和环境列表。shell先调用start-up,shell将环境列表和命令行参数作为参数传递给start-up routine。然后,start-up将根据系统进程的内存布局,将命令行参数和环境列表放在进程内存布局中,相依的位置。

linux下运行a.out

    在shell下运行某个编译后的可执行程序a.out,假设a.out是由helloworld.c编译所得。在shell下输入的命令行是:

~>./a.out。由于shell实际是由init创建的终端进程。因此,当在shell下输入~>./a.out时,shell将以./a.out为参数,创建一个新的进程,此进程将以./a.out为代码段来创建。首先执行start-up,然后,再在start-up中调用main()来实现其主要的功能。

0 0
原创粉丝点击