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



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. [2014 Regional]牡丹江 H Hierarchical Notation 做题记录

    主妇:老年人谁是炮灰牡丹江,我们的团队只是做同步大赛 他决定开爆震H什么时候,A 5min 1Y.I在该限制后,纠结了很久30min+ 1Y,神继续承担各种位置卡D在,hpp见B我认为这是非常熟悉的研 ...

  2. 【Swift】学习笔记(一)——熟知 基础数据类型,编码风格,元组,主张

    自从苹果宣布swift之后,我一直想了解,他一直没有能够把它的正式学习,从今天开始,我会用我的博客来驱动swift得知,据我们了解还快. 1.定义变量和常量 var  定义变量,let定义常量. 比如 ...

  3. UBUNTU12.04下安装配置体验gnome3

    年. ubuntu12.04默认采用unity界面,但是自己更加喜欢gnome3的操作方式. 安装gnome3: sudo apt-get install  gnome-shell 其实安装成功后,注 ...

  4. [Unity3D]脚本中Start()和Awake()的差别

    Unity3D刚開始学习的人常常把Awake和Start混淆. 简单说明一下,Awake在MonoBehavior创建后就立马调用,Start将在MonoBehavior创建后在该帧Update之前. ...

  5. MySQL replace 的简介

    今天同学discuz升级出现主键反复,导致数据插入不成功的问题,然后查找了一下,说的方法都是用replace into替换insert into,然后对replace into进行了查询,以下做一下简 ...

  6. Oracle 11g 的PL/SQL函数结果缓存

    模拟Oracle性能诊断艺术做了两个试验样品.书上说的不承担RELIES_ON.果缓存的失效操作(result_cache RELIES_ON(test1,test2)).试验证明不正确,函数f1() ...

  7. AIDL介绍和实例讲解

    前言 为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface ...

  8. Android:创建耐磨应用 - 语音操作

    加入语音处理能力(Adding Voice Capabilities) 语音操作为用户体验可穿戴的重要组成部分,它允许用户快速.免提方式来运行操作. Wear它提供了两种类型的语音操作的: 该系统提供 ...

  9. Webuploader 大文件分片上传

    百度Webuploader 大文件分片上传(.net接收)   前阵子要做个大文件上传的功能,找来找去发现Webuploader还不错,关于她的介绍我就不再赘述. 动手前,在园子里找到了一篇不错的分片 ...

  10. javascript于&quot;return obj === void 0&quot;这样的书面理由和优势

    得知underscore.js什么时候,查看源代码经常出现的类别似下面的代码: if (context === void 0) return func; if (array == null) retu ...