UNIX环保进程
学习的过程之前,先来了解下过程中的操作环境。
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环保进程的更多相关文章
- Unix守护进程
问题描述: Unix守护进程 问题解决: Unix守护进程没有控制终端,终端名设置为问号(?),终端前台进程组ID设置(TPGID)为-1 守护进程编写规则: (1) ...
- Linux/Unix分配进程ID的方法以及源代码实现
在Linux/Unix系统中.每一个进程都有一个非负整型表示的唯一进程ID.尽管是唯一的.可是进程的ID能够重用.当一个进程终止后,其进程ID就能够再次使用了. 大多数Linux/Unix系统採用延迟 ...
- 利用lsof去查看Unix/Linux进程打开了哪些文件
利用lsof去查看Unix/Linux进程打开了哪些文件 今天用了一下lsof,发现这个linux的小工具,功能非常强大而且好用. 我们可以方便的用它查看应用程序进程打开了哪些文件或者对于特定的一个文 ...
- 编写Linux/Unix守护进程
原文: http://www.cnblogs.com/haimingwey/archive/2012/04/25/2470190.html 守护进程在Linux/Unix系统中有着广泛的应用.有时,开 ...
- unix/linux 进程间文件锁
转自 http://www.cnblogs.com/hjslovewcl/archive/2011/03/14/2314333.html 有三种不同的文件锁,这三种都是“咨询性”的,也就是说它们依靠程 ...
- unix/linux进程详解
技术分享 启动新进程 stdlib.hintsystem(const char *string)whichequals to "sh -c string" 替换进程映像unistd ...
- UNIX基础--进程和守护进程
进程和守护进程 Processes and Daemons 进程(Processes) FreeBSD 是一个多任务操作系统. 这就意味着好像一次可以运行一个以上的程序. 每个占用一定时间运行的程序就 ...
- Unix 让进程安全地退出
终止一个进程有很多方法(暂只说linux环境):前台运行的进程,如果没有提供退出功能,我们通常会Ctrl+C进行终止:后台或守护进程,如果也没有提供退出命令啥的,咱通常会kill掉:此外还有类似关机或 ...
- Linux/UNIX之进程环境
进程环境 进程终止 有8种方式使进程终止,当中5中为正常终止,它们是 1) 从main返回 2) 调用exit 3) 调用_exit或_Exit 4) 最后一个 ...
随机推荐
- 举例说,在命令模式(Command Pattern)
在前面加上 谈到命令,大部分的人脑海中会想到以下这幅画面 这在现实生活中是一副讽刺漫画,做决定的人不清楚运行决定的人有何特点,瞎指挥.外行领导内行说的就是这样的.只是在软件设计领域,我们显然要为这 ...
- HTML<!DOCTYPE> 宣示
在html页面,下面这行代码到底有什么用呢? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...
- DV工作流
- JAVA字符串格式化-String.format()使用
传统型格类型 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. 熟悉C语言的同学应该记得C语言的sprintf()方法.两者有类似之处.format()方法有两种重载 ...
- 实验数据结构——KMP算法Test.ming
翻译计划 小明初学者C++,它确定了四个算术.关系运算符.逻辑运算.颂值操作.输入输出.使用简单的选择和循环结构.但他的英语不是很好,记住太多的保留字,他利用汉语拼音的保留字,小屋C++,发明 ...
- [LeetCode257]Binary Tree Paths
题目: Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree ...
- 用SourceTree轻巧Git项目图解
用SourceTree轻松Git项目图解 这篇文档的目的是:让使用Git更轻松. 看完这篇文档你能做到的是: 1.简单的用Git管理项目. 2.怎样既要开发又要处理发布出去的版本bug情况. Sour ...
- LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_ocl249.lib”
最近想要编译什么OpenCV资源.查看源代码调试执行. 按照网上的文章<Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV> 进行配 ...
- jqm视频播放器,html5视频播放器,html5音乐播放器,html5媒体播放器,video开展demo,html5视频播放演示示例,html5移动视频播放器
最近看到很多有用的论坛html5视频播放的发展,音乐播放功能,大多数都在寻找答案.所以,我在这里做一个demo.对于大家互相学习.html5开发越来越流行,至于这也是一个不可缺少的一部分的视频. 如何 ...
- Leetcode - Jump Game Two
和Jump Game几乎相同的想法,他们是DP.关键是使用数组maxNumbers[k]储存的地方k步骤的话.序列号的最远范围,注阵maxNumbers[]它递增. class Solution { ...