linux应用编程和网络编程-3.4.linux进程全解- 父子关系 exec system函数

本文深入探讨了Linux程序的开始与结束,包括C程序的执行过程、进程如何结束(正常与非正常)、环境变量以及进程的虚拟地址空间。重点介绍了exec族函数和system函数的用法,包括参数传递、错误处理和它们在进程中的作用。此外,还讨论了进程的父子关系以及如何使用ps和kill命令来管理和控制进程。
摘要由CSDN通过智能技术生成

程序的开始和结束

编译链接时的引导代码(构建执行环境)调用main函数

①编译链接时的链接器:将编译器中引导代码给连接进去和应用程序一起构成最终的可执行程序。
②运行时的加载器:将这个程序加载到内存中去执行这个程序。
程序在编译连接时用链接器,运行时用加载器,这两个东西对程序运行原理非常重要。

C程序的执行过程:
  C编译器调用链接器,链接器设置可执行程序文件的启动起始地址(启动例程),启动例程获得内核传递来的
  命令行参数和环境变量值,为调用main函数做准备。【实际上该启动例程常用汇编语言编写】,如果将启动例程换做C语言就是:exit(main(argc,argv));
main(int argc,char *argv[],char *engv[]);argv为指向参数的各个指针所构成的数组。

我们通常认为C语言的起始函数是main函数,实质上一个程序的启动函数并不一定是main函数,这个可以采用链接器来设置,但是gcc中默认main就是C语言的入口函数,在main函数启动之前,内核会调用一个特殊的启动例程,这个启动例程从内核中【取得命令行参数值和环境变量值】,为调用main函数做好准备,因此对应用程序而言main函数并不是起始,但是对应C语言而言,main函数就是入口地址,其他的由链接器帮助我们完成,实际上mian函数的执行是使用了exec函数,这是一个函数族,这也是内核执行一个程序的唯一方法。

程序如何结束

(1)正常终止:
return:会执行终止处理函数
exit:会执行终止处理函数,做一些清理工作,再进入内核
_exit /_EXIT:直接进入内核中。 不执行atexit注册的进程终止处理函数。
(2)非正常终止:自己或他人发信号(类似于电话标志)终止进程,信号也是有优先级的

atexit向操作系统注册进程终止处理函数(即main执行结束后调用的函数)

#include<stdlib.h>
int atexit(void(*func)(void));
  atexit负责注册,参数是一个函数地址(或者说是一个函数指针)
  进程终止处理函数void(*func)(void)负责进行清理操作

注意:按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用。atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们 登记时候的顺序相反(压栈过程)。同一个函数如若登记多次,则也会被调用多次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值