c语言中的多进程的实现

本文详细介绍了C语言中如何实现多进程,包括进程的基本概念、进程的生命周期、进程控制块PCB、进程的创建与结束方式以及相关命令。通过示例代码展示了如何在C语言中使用fork、exit等函数创建和管理进程,并讨论了守护进程的创建及exec函数族的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、进程的相关概念

1.什么是进程?

进程:程序的一次执行过程就会创建一个进程,进程就是一个正在执行的任务,进程的所用信息通过task_struct(PCB)结构体记录,进程是分配资源的最小单位,进程是调度器调度的实体,每一个进程单独拥有自己的0-3G的(虚拟内存)空间,这0-3G包含堆、栈区、静态库。还包括文件描述符的表。程序执行结束的时候0-3G的空间就会被释放了,每一个进程都有自己的唯一的标识pid,pid就是进程号。

进程号pid:进程的唯一的标识,它是一个非负整数,由操作系统随机分配。pid就可以理解为进程的身份证号ID。系统中正在执行的进程的进程号可以在/proc目录下查看。

注:在操作系统上查看一个操作系统能够分配的最大的进程号的命令cat /proc/sys/kernel/pid_max                                                                                                              ===>131072

2.进程和程序有什么区别?

进程:进程是动态的,具有生命周期,正在运行的进程在内存上存放。

程序:程序是静态的文件,没有生命周期,它是在磁盘上存放着。在执行一个程序的时候就会创建一个进程。

3.进程的组成部分

进程的组成部分:进程控制块PCB,数据段,程序段组成

进程控制块(pcb):进程控制块其实在内核空间就是一个task_struct结构体,这个结构体记录了进程的所有的信息,例如进程的标号pid,进程的执行状态,进程的使用的内存空间等等。

数据段:堆、栈、.data、.bss

程序段:存放的是a.out的可执行程序的文本

示例:

struct task_struct{
    进程的pid
    进程的状态state
    进程运行的内存
    ...
};

4.进程的种类

交互进程:交互进程是由shell控制的,交互进程可以是前台进程,也可以是后台进程(./a.out &)。例如文本编辑器

批处理进程:批处理进程不属于某一个终端,在操作系统内部维护了一个队列。例如gcc编译程序的过程

守护进程:守护进程一直在后台执行,随着系统的启动而运行,随着系统的终止而终止。例如:服务

5.一些特殊的进程

0号进程(idle):在linux系统启动的时候,执行操作系统代码的进程,当没有其他进程需要执行的时候就会运行0号进程

1号进程(init):1号进程是0号进程通过kernel_thread(内核)函数创建的,后面的进程都是拷贝这个进程得到的。1号进程可以回收没有回收的资源

2号进程(kthreadd):2号进程是0号进程通过kernel_thread(内核)函数创建的,调度进程执行的进程

6.进程的状态

进程的状态
D    //不可中断的等待态(sleep)(不可被信号中断)
R    //运行态
S    //可中断的等待态(sleep)(可被信号中断)
T    //停止态
t    //代码追踪调试状态
X    //死亡态
Z    //僵尸,子进程死了,父进程没有为他收尸,如果父进程也死掉,init进程为它收尸

进程的附加状态
< 高优先级的进程
N 低优先级的进程
L 将进程的所在的内存所在内存区间
s 会话组组长
l 在进程中包含多线程
+ 前台进程

二、进程操作相关的一些命令

1.ps命令

 ①ps -ef (查看进程的pid和ppid)

运行结果:

UID PID PPID C STIME TTY  TIME    CMD
root   1      0     0  05:11    ?   00:00:06 /sbin/init auto noprompt
root   2      0     0  05:11    ?   00:00:00 [kthreadd]
root   3      2     0  05:11    ?   00:00:00 [rcu_gp]
root   4      2     0  05:11    ?   00:00:00 [rcu_par_gp]

//UID:进程所属的用户
//PID:进程的ID号
//PPID:父进程的ID号
//pidof a.out 可以查看a.out的进程号

②ps aux (查看进程的状态)

运行结果:
USER PID %CPU %MEM VSZ     RSS TTY STAT START TIME COMMAND
root          1    0.0       0.1 225416  7896   ?     Ss     05:11   0:06 /sbin/init auto noprompt
root          2    0.0       0.0      0          0      ?     S       05:11   0:00 [kthreadd]
root          3    0.0       0.0      0          0      ?     I<      05:11   0:00 [rcu_gp]
root          4    0.0       0.0      0          0      ?     I<      05:11   0:00 [rcu_par_gp]
root          6    0.0       0.0      0          0      ?     I<      05:11   0:00 [kworker/0:0H-kb]
root          9    0.0       0.0    &nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值