Linux进程全解1——程序的开始、结束
来源:互联网 发布:mcmore php 编辑:程序博客网 时间:2024/06/05 15:39
以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。
1、main函数由谁调用?
(1)编译链接时的引导代码
- 操作系统下的应用程序,在main函数执行前,需要先执行一段引导代码(作用,如构建c语言环境);
- 写应用程序时,不用考虑引导代码的问题,因为自带的;
- 链接时,由链接器将编译器中事先准备好的引导代码给连接进去,和应用程序一起构成最终的可执行程序。
(2)运行时的加载器
- 加载器是操作系统中的程序,当执行一个程序时(譬如./a.out,譬如在代码中用exec族函数来运行),加载器负责将程序加载到内存中。
(3)程序在编译连接时用链接器,运行时用加载器,这两个东西对程序运行原理非常重要。见书籍《链接器和加载器》。
(4)argc和argv的传参如何实现的?
- 先传给加载器,加载器传给引导代码,最后引导代码传给main。
2、程序如何结束?
(1)正常终止:return、exit、_exit;
(2)非正常终止:自己或他人发信号,终止进程;(比如ctrl c 终止正在运行的程序)
3、使用atexit注册(进程终止处理函数)
- 所谓进程终止处理函数,即进程终止前,所要做的处理;
- atexit函数的原型如下。
(1)实验演示
#include <stdio.h>#include <stdlib.h>#include <unistd.h>void func1(void){printf("func1\n");}void func2(void){printf("func2\n");}int main(void){printf("hello world.\n");// 当进程被正常终止时,系统会自动调用这里注册的func1执行atexit(func2);atexit(func1);printf("my name is lilei hanmeimei\n");//return 0;//exit(0);_exit(0);}
(2)使用atexit注册多个进程终止处理函数,先注册的后执行。
- 先进后出,和栈一样,其实就是对函数指针进行压栈(注册时)、出栈操作(执行时);
(3)return、exit和_exit的区别
- return和exit效果一样,都是会执行进程终止处理函数;
- 用_exit终止进程时,并不执行atexit注册的进程终止处理函数。
阅读全文
0 0
- Linux进程全解1——程序的开始、结束
- Linux系统编程——进程的控制:结束进程、等待进程结束
- Linux系统编程——进程的控制:结束进程、等待进程结束
- Linux系统编程——进程的控制:结束进程、等待进程结束
- Linux系统编程——进程的控制:结束进程、等待进程结束
- Linux系统编程——进程的控制:结束进程、等待进程结束
- 程序中开始和结束某个进程
- linux 程序里结束进程
- 程序的开始和结束
- Linux进程全解9——进程状态、system函数、进程间的关系
- 获取进程的开始、结束时间
- Linux进程全解10——守护进程
- PHP程序的开始与结束
- Linux进程全解5——父子进程对文件的操作
- Linux进程全解6——进程的诞生和消亡
- LINUX查看进程开始时间、结束时间、运行时间
- Linux进程全解3——进程概念、进程ID、多进程调度原理
- Linux进程全解2——进程环境(环境变量、进程运行的虚拟地址空间)
- sketch 映客Android 设计
- Apache 的 httpd 过程占用大量内存原因及其解决方案
- win10上使用putty通过ssh连接Linux
- CSS基础知识总结之基本概念
- 今天学习的时候偶然发现了一个有趣的题目,可以用编程实现。
- Linux进程全解1——程序的开始、结束
- c#小程序——画一棵树(v1与v2)
- 2. 掀起接口测试的盖头-HTTP初窥(一)
- C语言基础编程之统计字母,数字和空格
- B/S初识
- JSch
- 北京大学可视化发展前沿研究生暑期学校Day4
- Android开发工程师面试题整理(百度)
- CSS样式的学习