进程环境详解(一)---main函数调用

  通常我们认为 main 函数是整个程序的入口,当然这也仅仅是我们的认为,实际上整个可执行文件的入口点并不是 main 函数,而是一个名为 _start 的标号。这一点在笔记 “ARM裸机->关于链接脚本中程序入口”中提到了。

  在ARM裸机中,我们编写的 c 程序中也会有 main 函数,但是我们是会在 start.S 这个文件中去调用 main 函数,从而进入到 c 语言环境中,而这个 start.S 我们称为启动代码。在start.S中我们会做各种初始化工作,为 c 语言程序的运行提供环境。

  类似的,在操作系统下运行程序实际上是由 exec 函数来运行我们的可执行文件(这是因为我们的进程都是由父进程(shell进程)创建而来,在子进程中使用exec函数来让子进程执行我们的程序),而可执行文件的真正入口应该是启动代码,这个启动代码会调用 main 函数,并且会从内核中获取命令行参数和环境变量,为 main 函数做好准备。当进程在 main 函数中返回到启动代码中时,启动代码会立即结束进程。

  从这里可以看出,main 函数的参数是启动代码传过去的,main 函数返回也是返回给启动代码。

时间: 2024-12-25 02:01:37

进程环境详解(一)---main函数调用的相关文章

进程环境详解(三)---环境表

启动代码除了会将命令行参数传递给 main 外,还会从内核中获取到一张环境表.该环境表是由全局变量 environ 来指向的.environ 的类型定义如下: extern char ** environ: /* 这个定义在 unistd.h 头文件中 */ ===================================================== 但是在实际测试当中,使用environ指针的时候却报错了,如下图所示 于是去 unistd.h 头文件中查看 environ 的原始

进程环境详解(四)---getenv、putenv和setenv函数详解

在Linux中的c程序的典型内存分布中,之前提到的有 text段.data段.bss段.堆和栈这几部分,在笔记“麦子学院c语言->典型c语言程序的c内存分布”中介绍了.但是其实一个c语言进程的内存分布中不止是有这些区域,还有命令行参数.环境变量以及共享库和mmap映射区等区域.如下图所示 ------------------------------ 环境变量区域 命令行参数 栈 共享库和mmap映射区 堆 bss段 data段 text段 ----------------------------

进程环境详解(二)---进程终止和 atexit 函数详解

进程终止可以分为 进程正常终止 和 进程异常终止 . 进程正常终止有以下几种情况: 在 main 函数返回 调用 exit 函数 调用 _exit 或者 _Exit 函数 最后一个线程从启动代码中返回 最后一个线程调用 pthread_exit 进程异常终止有以下几种情况: 调用 abort函数 进程收到信号终止 最后一个线程对取消请求作出响应 ======================================================== exit 函数 和 _exit / _

进程环境详解(五)---堆分配malloc、free函数详解

堆上的空间不是连续的,栈上的空间是连续的. 使用malloc函数可以获得堆上的内存空间,注意一点虽然堆上的空间是不连续的,但是调用一次malloc函数分配的是还是连续的内存. 比如malloc(10)会在堆上找到一片有10个字节大小的连续空间分配给用户程序,然后再调用一次malloc(5)会在堆上找到一片有5个字节大小的连续空间给用户程序,这两次分配的空间并不是连续的. 使用malloc分配的内存空间需要用户调用free()函数手动来释放,不释放会造成内存泄漏.但是也不能使用free()函数多次

linux进程地址空间详解(转载)

linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示windows上的结果也一样). 我们还是利用前面看到过的这个图,如下图:32位X86机器的内存布局图,内存主要分为栈.堆.BSS段.数据段.代码段5个段.   代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存

Object-C 入门 Xcode 环境详解 HelloWorld 程序

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38424965 一. Xcode 环境安装 与 工程创建 1. 下载环境 相关资源下载 : -- IOS 相关资料下载页面 : https://developer.apple.com/devcenter/ios/index.action ; -- Xcode 下载页面 : https://developer.apple.com/xcode/downloads/

linux进程标识符详解1

每个进程都有一个实际用户标识符和一个实际组标识符,它们永远是启动该进程之用户的用户标识符和组标识符. 进程的有效用户标识符和有效组标识符也许更重要些,它们被用来确定一个用户能否访问某个确定的文件.在通常情况下,它们与实际用户标识符和实际组标识符是一致的. 有几个系统调用可以用来得到进程的用户标识符和组标识符,详见下列程序: /* 取进程的实际用户标识符 */ uid=getuid(); /* 取进程的有效用户标识符 */ euid=geteuid(); /* 取进程的实际组标识符 */ gid=

Linux系统环境搭建SVN服务器环境详解

Linux系统环境搭建SVN服务器环境详解: 本篇文章主要介绍的内容是在Linux系统下如何搭建SVN服务器的,目的是为了很好的实现代码版本控制管理,具体如下所示介绍: 一.安装需要的软件包 #yum install subversion     ---安装SVN服务工具 #yum install httpdmod_dav_svn mod_perl    ---用于支持WEB方式管理SVN服务 #yum install wgetmake unzip perl*       ---必备的软件包 二

Linux01-Linux进程管理详解44

一.进程    1.进程属性: a)进程状态 b)父子关系 c)优先级关系 0-139用户优先级,数字越小优先级越高: 0-99:内核调整的 100-139:用户可控制 nice值: -20-19 100-139 普通用户仅能够调大自己的进程的Nice值: 2.进程优先级 a)衡量面对不同的算法时,程序的性能如何,O标准(坐标轴表示): O(1) O(n) O(logn) O(n^2) O(2^n) b)每个进程的PID都是唯一的: init: 进程号为1 3.进程的分类: 跟终端相关的进程 跟