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



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. 玩转Web之servlet(五)---- 怎样解决servlet的线程安全问题

    servlet默认是存在线程安全问题的,但是说白了,servlet的线程安全问题实际上就是多线程的线程安全问题,因为servlet恰巧是一个多线程才会出现安全性问题. 浏览器每次通过http协议去提交 ...

  2. 微信公众平台入门--PHP,实现自身的主动回复文本,图像,点击事件

    微通道基本应答代码,然后单击事件函数,部署了sae要么bae,基本自由妥妥server 号了 <?php define("TOKEN", "mzh"); ...

  3. 9种CSS3 blend模式制作的鼠标滑过图片标题特效

    这是一款使用CSS3 background-blend-mode制作的鼠标滑过图片标题特效.该图片标题特效在鼠标滑过一张图片的时候,图片的标题会对应的动画,而且图片会使用css blend模式渲染为很 ...

  4. Android源码文件夹结构

    Android 2.2 |-- Makefile |-- bionic               (bionic C库) |-- bootable            (启动引导相关代码) |-- ...

  5. C#如何获得 WINDOWS 版本号

    using System; using System.Runtime.InteropServices; namespace GetWindowsVersion { [ StructLayout( La ...

  6. Handler消息源代码分析

    public static final Looper myLooper() { return (Looper)sThreadLocal.get(); } 首先到Handler运行过程的总结: 1. L ...

  7. uva 10831 - Gerg&#39;s Cake(勒让德符号)

    题目链接:uva 10831 - Gerg's Cake 题目大意:给定a和p.p为素数,问说是否存在x,使得x2≡a%p 解题思路:勒让德记号,推断ap−12≡1%p #include <cs ...

  8. FastReport的再次使用

    FastReport.Net是一款功能齐全的报表分析解决方案. 前两年工作的时候就是使用FastReport进行报表设计,只是当时使用的时候都是调用别人写好的帮助类,直接调用即可.当时让人觉得不明觉厉 ...

  9. 【转】介绍Jython,第一部分:轻轻松松写JAVA程序

    本文转自:http://www.ibm.com/developerworks/cn/education/java/j-jython1/index.html 关于本教程 本教程介绍哪些内容? 这个两部分 ...

  10. cocos2d-x删除本地存储的文件UserDefault.xml方法——白费

    许多其他的精彩分享:http://blog.csdn.net/u010229677 首先获取UserDefault的存储位置.然后remove就可以: remove( UserDefault::get ...