【Linux学习之系统编程】Linux中进程控制总结

本文详细介绍了Linux系统中的进程控制,涵盖了进程的创建(fork和vfork函数)、进程的终止、进程等待(wait和waitpid系统调用)以及进程的程序替换(exec函数族)。通过实例解析了各函数的使用方法和注意事项,是学习Linux进程控制的重要参考资料。
摘要由CSDN通过智能技术生成

进程控制有进程的创建进程的等待进程的程序替换进程的终止等这些,我们在这篇博客里总结一下有关方面

一、进程的创建

在Linux学习时有关进程的总结中,我们用到了fork函数创建一个子进程,当时只是大致的写了写,这里再对fork函数总结,关于进程的博客总结:

点击打开链接

1.fork函数

在linux中fork函数是非常重要的一个函数,它从当前进程中创建一个新进程,新进程是子进程,原进程为父进程

包含它的头文件和函数原型如下:

#include <unistd.h>
pid_t fork(void);

fork函数有两个返回值,在父进程中返回子进程的pid,在子进程中返回0,出错就返回-1,pit_t类型就是一个整数类型

fork函数创建一个子进程时,fork函数分配新的内存块和内核数据结构给子进程,把父进程部分数据结构内容拷贝入系统进程列表中,然后fork函数返回,开始调度器调度。注意,子进程完全复制父进程的资源,复制出来的子进程有自己的PCB和pid,这样的子进程独立于父进程,具有良好的并发性。

我们来写一段代码实验一下

如图,我们在父子进程中都打印了pid和fork的返回值,结果如下:


我们看到有三行输出,第一行是第一个printf打印的before,即调用 fork函数之前,后面两行是fork函数之后的子进程和父进程打印的,fork函数在父进程返回的是子进程ID,子进程返回0。

通过fork创建子进程,需要对父进程的所有资源都进城复制,子进程和父进程的执行流是相同的,fork之前父进程独立执行,fork之后父子进程两个执行流分别执行。

注意,fork之后谁先执行由调度器决定,为什么我们这里看到的是父进程先执行,子进程后执行呢?因为fork创建子进程对父进程的所有资源进程复制,它的开销是很大的,所以子进程一般都执行的慢

1.1写时拷贝

由于fork创建子进程时,子进程对父进程进行复制,这样的开销比较大,所以就用了写时拷贝的机制,通常父子代码共享,父子不再写入时,数据也是共享的,即父子进程共用一份页表,当一方试图写入时,便以写时拷贝的方式拷贝一份副本。

fork的常规用法和调用失败的原因

1.2fork的常规用法

·一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如父进程等待客户端请丢,生成子进程来请求处理

·进程想执行另外一个程序

1.3失败的原因

·系统中进程太多

·实际用户的进程数超过了限制

2.vfork函数

函数原型如下:

pit_t vfork(void);

vfork函数也是用来创建进程的,有以下几个特性:

·在父进程中,vfork返回子进程的pid

·在子进程中,vfork返回0

·出现错误返回-1

但是,vfork与fork是有不同点的:

·vfork创建的子进程,父进程和子进程共享地址空间

·vfork保证子进程先运行,在它调用exec(exit)之后父进程才可能被运行

看下面的代码:


运行结果如下:


这说明父进程和子进程共享同一段内存空间

用vfork创建子进程后,父进程会被阻塞到父进程调用exec或exit

exec:将一个新的可执行文件载入到地址空间中并执行

2.1vfork函数的用途

用vfork函数创建子进程主要的用途是用exec函数执行另外的程序

二、进程的终止

1.进程的退出场景

进程有以下三种退出的场景:

·代码运行完毕,结果正确

·代码运行完毕,结果不正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值