学习的过程之前,先来了解下过程中的操作环境。



main功能

过程总是开始main功能开始执行,我们编程,程序从main功能进行,它是原型例如,下面的:

int main(int argc, char *[]argv);

argc是命令行參数的数目。argv是指镇数组。即指向指针的指针,能够写代码測试一下:

#include<stdio.h>

int main(int argc, char *argv[])

{

        int i;

        for(i=0; i<argc; i++)

                printf("argv[%d]:%s\n",i,argv[i]);

        exit(0);

}

输出:

linux:/home # ./test this is a test program

argv[0]:./test

argv[1]:this

argv[2]:is

argv[3]:a

argv[4]:test

argv[5]:program

在调用main函数之前,内核先调用一个特殊的启动例程,它从内核取得命令行參数和环境变量的值,可运行程序文件将此启动例程指定为程序的起始地址。

内核使用exec函数来启动C程序。



进程终止

有5种方式能够终止进程

(1)正常终止

(a)从main函数返回

(b)调用exit

(c)调用_exit

(2)异常终止

(a)调用abort

(b)由一个信号终止

在上面的正常终止中有exit和_exit,差别在于:_exit调用后马上进入内核。而exit则会先运行一些清除工作(包含调用运行各种终止处理程序,关闭全部标准I/O流等),然后在进入内核。它们定义例如以下:

#include<stdlib.h>

void exit(int status);

#include<unistd.h>

void _exit(int status);

使用了不同的头文件,由于exit是右ANSI C说明的。而_exit是由POSIX.1说明的。

atexit函数

我们能够在进程中登记一些函数(最多32个),这些函数由exit调用。这种函数叫做终止处理程序(exit handler),有atexit函数来登记。

这点看起来有点像类的析构函数。

#include<stdlib.h>

int atexit(void (*func)(void));

其參数是一个函数地址。

exit调用顺序与登记顺序相反,先登记后调用(像栈),同一个函数能够被登记多次。





环境表

进程的执行都有一个环境,环境的信息存储在环境表里面。

环境表是一个字符指针数组。当中每一个指针包括一个以NULL结束的字符串的地址。全局变量environ包括了该指针数组的地址:

extern char **environ;



程序的存储空间布局

C程序由下面几部分组成:

正文段:也叫代码段,是CPU运行的机器指令。正文段一般能够共享的。且是仅仅读的。

初始化数据段:也叫做数据段,包括程序中已经初始化的全局变量和静态变量。

非初始化数据段:也叫做bss段,包括未初始化的全局变量和静态变量,在程序运行之前有内核初始化为0。

不在代码中存储器初始值,能够减小代码的大小。

栈:自己主动存储变量以及每次函数调用时所需保存的信息都放在此段中。

每次函数调用时,其返回地址、以及寄存器中的变量都放在栈中。新被调的函数在栈上为其自己主动和暂时变量分配存储空间。

堆:进行动态分配的变量。

须要手动释放。堆位于未初始化数据段的顶和栈底之间。





存储器的分配:

能够參考这里



setjmp和longjmp

在C语言,可以用于goto语言(虽然不建议)。但goto声明不能跳功能。当你运行这个功能,搜索功能setjmp和longjmp。这两个函数用于处理发生在非常深的嵌套调用中的错误是非常容易使用。

递归调用返回唯一能够恢复到以前的功能,这两个功能就可以使它递归调用的。

UNIX环保进程的更多相关文章

  1. Unix守护进程

    问题描述:         Unix守护进程 问题解决:     Unix守护进程没有控制终端,终端名设置为问号(?),终端前台进程组ID设置(TPGID)为-1 守护进程编写规则:      (1) ...

  2. Linux/Unix分配进程ID的方法以及源代码实现

    在Linux/Unix系统中.每一个进程都有一个非负整型表示的唯一进程ID.尽管是唯一的.可是进程的ID能够重用.当一个进程终止后,其进程ID就能够再次使用了. 大多数Linux/Unix系统採用延迟 ...

  3. 利用lsof去查看Unix/Linux进程打开了哪些文件

    利用lsof去查看Unix/Linux进程打开了哪些文件 今天用了一下lsof,发现这个linux的小工具,功能非常强大而且好用. 我们可以方便的用它查看应用程序进程打开了哪些文件或者对于特定的一个文 ...

  4. 编写Linux/Unix守护进程

    原文: http://www.cnblogs.com/haimingwey/archive/2012/04/25/2470190.html 守护进程在Linux/Unix系统中有着广泛的应用.有时,开 ...

  5. unix/linux 进程间文件锁

    转自 http://www.cnblogs.com/hjslovewcl/archive/2011/03/14/2314333.html 有三种不同的文件锁,这三种都是“咨询性”的,也就是说它们依靠程 ...

  6. unix/linux进程详解

    技术分享 启动新进程 stdlib.hintsystem(const char *string)whichequals to "sh -c string" 替换进程映像unistd ...

  7. UNIX基础--进程和守护进程

    进程和守护进程 Processes and Daemons 进程(Processes) FreeBSD 是一个多任务操作系统. 这就意味着好像一次可以运行一个以上的程序. 每个占用一定时间运行的程序就 ...

  8. Unix 让进程安全地退出

    终止一个进程有很多方法(暂只说linux环境):前台运行的进程,如果没有提供退出功能,我们通常会Ctrl+C进行终止:后台或守护进程,如果也没有提供退出命令啥的,咱通常会kill掉:此外还有类似关机或 ...

  9. Linux/UNIX之进程环境

    进程环境 进程终止 有8种方式使进程终止,当中5中为正常终止,它们是 1)      从main返回 2)      调用exit 3)      调用_exit或_Exit 4)      最后一个 ...

随机推荐

  1. 重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件

    原文:重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件 [源码下载] 重新想象 Windows 8 Store Apps ( ...

  2. Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)

    Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database U ...

  3. Net Memory Profiler 分析.Net程序内存泄露

    Net Memory Profiler 分析.Net程序内存泄露 Haozes's Tech Space 人類的全部才能無非是時間和耐心的混合物 使用.Net Memory Profiler 分析.N ...

  4. How to fix Column 'InvariantName' is constrained to be unique 解决办法!

    Introduction When you build a web project that uses Enterprise Library Community for the Application ...

  5. Android异步任务

    本文主要探讨Android平台提供的各种异步载入机制,包括它们的适用场景.用法等. 1. AsynTask AsynTask适用于最长能够持续几秒钟的短时间的操作,对于长时间的操作,建议使用java. ...

  6. Autodesk FBX SDK Program 中文 (二)

    这是Autodesk FBX SDK学习笔记第二篇.下面部分汉字翻译自Autodesk FBX SDK Program.翻译人:有道翻译. 上一篇讲了一些FBX SDK的基本操作.创建FbxManag ...

  7. poj 1384 Piggy-Bank(全然背包)

    http://poj.org/problem?id=1384 Piggy-Bank Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...

  8. Windows8.1和Ubuntu14.04双系统卸载Ubuntu參考教程[图]

    我之前编写并公布了<Windows8.1安装Ubuntu14.04双系统參考教程及双硬盘注意事项>这篇教程,而本文提供的卸载Ubuntu方法适用于这篇教程,其它方法安装的Ubuntu可适当 ...

  9. 什么是PV,UV。

    PV浏览(Page View).该网页访问量,每次页面打开PV统计+1,也刷新. IP接入号码指独立IP接入号码,计算基于独立IP在计算的时间段来计算访问我们的网站1二级IP接入号码. 是否这个计算在 ...

  10. 他们主动布局(autolayout)环境的图像编辑器

    hi,all: 在经过了一番犹豫之后.我决定将我自己做的这个小APP的源代码发布给大家: 其出发点是和大家一起学习iOS开发.仅供学习參考之用. 之前代码是托管与gitlab 上的,今天我将其pull ...