标签:进程、exit、atexit、栈帧、fork、execve
★进程相关概念
(1)进程:是一个能够分配处理器并由处理器执行的,能够携带资源的活动实体。
(2)进程控制块(PCB):每一个进程中都有唯一的一个进程控制块来保存进程的相关信息,实际PCB就是一个task_struct的结构体。具体的见http://10740590.blog.51cto.com/10730590/1785457
(3)进程状态:进程是一个活动实体,并不代表进程是一直处于运行状态,一个进程可以有很多种状态。
△R(running)表示运行状态
△S(sleeping)表示可唤醒睡眠状态
△D(disk sleep)表示不可唤醒的睡眠状态
△T(stopped)表示暂停状态
△t(tracing stop)表示终止状态
△X(dead)表示死亡状态
△Z(zombie)表示僵尸状态
★进程创建执行
进程的创建有两种方法:fork()和execve()。两者都是创建的进程都是运行进程的子进程,创建后的子进程会得到父进程中的数据段、栈段、堆区域的一份拷贝,这些子进程都是可以对其进行更改的,但是文本段是两者共享的,不能被子进程进行修改。
下面是fork的使用方法:
运行结果:
★进程终止
进程终止有以下几种方式:
(1)从main函数返回
(2)调用exit函数
(3)调用_exit或_Exit;
(4)最后一个线程从启动例程返回
(5)最后一个线程调用pthread_exit;
(6)调用abort函数
(7)接到一个信号并终止
(8)最后一个线程对取消请求做出相应
前5种为正常终止,后三种为异常终止。从main函数中return退出为进程退出,因为没有在继续执行的代码,但是在程序中间的任何位置return,不算是进程退出,只能算是程序调用结束。
exit返回:
exit()还让return系统会强制刷新缓冲区,文件描述符
_exit()强制直接结束,不需要管其余的东西
_Exit()和_exit是相同的
★exit函数与atexit函数
(1)exit、atexit函数定义
头文件:#include <stdlib.h> 头文件:#include <stdlib.h>
void exit(int status); int atexit(void (*fun)(void));
一个进程可以登记若干个函数,这些函数由exit自动调用,这些函数被称为终止处理函数,atexit函数就可以登记这些函数。exit调用终止处理函数的顺序和atexit登记的顺序是相反的,如果一个函数可以被多次的登记,也可以被多次的调用。
运行结果:
★栈帧
1.堆栈
堆栈是C语言以及其他语言运行时必须使用的一块空间,它的主要作用是函数调用、传递参数、保存返回地址、提供局部变量空间的。
①堆需要程序员自己申请,并且需要显示的进行释放,申请和释放必须是成对出现的,要不然就会出现内存泄漏,因为堆上的空间生命周期都是一直存在,直到手动进行释放。而栈是系统自动进行分配的,回收也是进程运行结束时系统自动回收。
②堆的空间较大,栈的空间小,一般申请大的内存都在堆上。
2.栈帧的详细解释:http://blog.csdn.net/yxysdcl/article/details/5569351
本文出自 “无心的执着” 博客,谢绝转载!
标签:进程、exit、atexit、栈帧、fork、execve
原文地址:http://10740590.blog.51cto.com/10730590/1829593