Linux内核开发三:多进程编程

本文详细介绍了Linux中的进程概念,包括进程的生命周期、PID、内存管理和进程间的关系。阐述了C语言中的main()函数及其参数,探讨了Linux进程的内存管理机制,如虚拟内存、栈、堆、数据段等。此外,还讲解了Linux系统如何通过fork()、vfork()、exec函数族创建和管理进程,以及进程的退出方式和等待子进程的方法,强调了避免僵尸进程的重要性和wait()函数的应用。
摘要由CSDN通过智能技术生成

 

1 、什么是进程

 

我们可以通俗地把进程看作是正在运行着的二进制程序,占用内存空间消耗系统资源,例如使用 vim 命令编辑文件内容就会生成一个进程。进程是 OS 资源分配的基本单位,每个进程在操作系统中都执行着特定的任务。如网络服务/etc/init.d /network 是管理各个以太网接口的守护进程。

 

进程启动后,系统会为它分配一个唯一的数值,用于标识该进程,这个数值就称为进程号 PID,每个进程都有自己的用户、工作目录、进程状态、父子关系、内存结构、启动命令、文件句柄等情况,都记录在/proc/PID/目录下,通常使用 ps 命令和 top 命令查看。

 

2、c 语言的 main()函数

 

C 程序总是从 main 函数开始执行,通常情况下,对一个大型的软件项目,有几个 main()

 

就有几个进程。main()函数的原型是:int main(int argc,char* argv[1],char *env[]); argc 是命令行参数的个数,程序文件路径自身是第一个参数。 argv 字符指针数组中保存了指向各个参数字符串的指针,argv[0]就指向程序文件。

 

env 字符指针数组中保存了指向当前系统中每个环境变量字符串的指针,也就是环境表的首地址,环境表以 null 结尾,和命令 env 的输出一致。

 

void main ( int argc , char *argv[] ,char *env[] ) { int i ;
fprintf ( stdout , ” 参数个数 argc = %d\n ” , argc ) ;
 
for ( i = 0 ; i < argc ; i++ ) printf ( “ 参数 argv[%d] = %s \n ” , i , argv[i] ); for ( i = 0 ; env[i] ; i++ ) puts ( env[i] ) ; //逐个打印环境变量
 
}


 

3、Linux 进程的内存管理机制

 

Linux 进程内存管理的对象都是虚拟内存,每个进程先天就有 0-4G 的各自互不干涉的虚拟内存空间,0—3G 是用户空间执行用户自己的代码, 高 1GB 的空间是内核空间执行 Linu x 系统调用,这里存放在整个内核的代码和所有的内核模块。用户所看到和接触的都是该虚拟地址,并不是实际的物理内存地址。虚拟内存不能直接存储数据,必须要先映射真实物理内存,C 语言中内存动态分配函数 malloc 严格来说不是分配内存,而是用这先天就存在虚拟内存映射物理内存的。

 

Linux 内存分配和回收以内存页为单位,一页是 16 的 3 次方共 4096 个字节。进程的内存结构都保存在/proc/$(pid)/maps 文件中,下图为 Linux 进程典型存储器安排:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值