Linux进程控制

简介: Linux进程控制

一、进程创建


1.pid_t fork(void)

写时拷贝的方式创建一个新的子进程,父子进程代码共享,数据独有。


例:


1.png


创建的子进程会复制父进程pcb中大部分信息,与父进程的虚拟地址空间是相互独立的,但是该块内存是属于父进程的,子进程若要对数据进行修改,会触发写时拷贝技术,系统会为子进程重新开辟空间,将数据拷贝进去,并修改子进程的映射关系(此时两个进程对应数据的虚拟地址相同,但是实际存储地址不同,互不影响)。


2.pid_t vfork(void)


创建一个新的子进程,父子进程共用同一个虚拟地址空间。


特性:


因为vfork创建子进程后,父子进程共用虚拟地址空间,因此用的是同一个栈,一个进程对数据做修改,也会体现在另一方。


这样会有一个大的隐患,调用栈混乱,因此vfork创建子进程后,父进程需要阻塞,直到子进程退出或进行了程序替换,创建了自己的地址空间以及各项数据。


例:


image.png


父子进程共用同一个虚拟地址空间,所以映射到的物理内存也相同,一个进程对数据进行了修改,另一个进程内也会体现。


其实vfork是早期为了提高进程创建效率而提出来的,但是在fork实现了写时拷贝技术之后,就很少使用了。


二、进程终止


即如何退出一个进程。


1.退出场景


· 正常退出:符合预期结果退出;不符合预期结果退出


运行到了main的return,或exit接口后退出。


· 异常退出


程序没有运行完毕,中途崩溃退出。


2.常见退出方法


2.1从main中返回


注意:return只有在main中才是退出运行,在其他函数中只是退出对应函数。


2.2调用库函数exit


库函数:void exit(int return_val)


可以在程序代码的任意位置进行调用,用于退出程序的运行;退出前会刷新缓冲区数据到文件。


2.3系统调用接口_exit


系统调用接口:void _exit(int retturn_val)


可以在程序代码的任何位置进行调用,用于退出程序的运行;直接退出释放资源。


相关知识扩展


1.库函数与系统调用接口的关系


库函数是针对典型应用功能对系统调用接口进行的封装,以便于使用。


2.buff-缓冲区&cache-缓存


· buff-缓冲区


相对于文件来说就是数据写入文件前,先放到缓冲区中,待积累成为大数据一次性刷新缓冲区写入文件,减少IO次数。


· cache-缓存


相对于文件来说就是从文件中读取数据,一次拿出的是一个磁盘块的数据放到内存中,下一次读取数据的时候先从缓存中对比。


3.如何获取上一步系统调用接口的错误原因


void perror("fork error");


获取上一步系统调用接口的错误原因。


char* strerror(int errno);
printf("fork error:%s\n",strerror(errno));等价于perror


注:int errno是全局变量,用于存放上一次系统调用的错误原因编号。


三、进程等待


1.功能与作用

父进程创建子进程后,等待子进程退出,获取子进程的退出返回值,释放子进程资源,避免僵尸进程的产生。


2.进程等待的方法


#include<sys/wait.h>


2.1wait方法


pid_t wait(int* status);


阻塞等待任意一个子进程的退出,使用status作为输出参数获取子进程的退出返回值。


返回值


成功,返回处理的这个退出的子进程的进程ID;失败,返回-1。


2.2waitpid方法


pid_t waitpid(pid_t pid,int* status,int options);


参数:


pid_t pid:指定要等待的子进程ID;-1则表示等待任意一个子进程。


int* status:输出参数,用于向外界返回退出子进程的返回值。


1)异常退出码获取:WIFEXITED(status)  正常终止返回true


2)进程退出返回值获取:WEXITSTATUS(status)


int options:操作选项:


0——阻塞等待;


WNOHANG——设置接口为非阻塞:有子进程,但是没有退出,则waitpid接口直接返回0,不阻塞。


返回值:


成功等待子进程退出,返回子进程的pid;失败,即当前没有子进程,返回0;出错,返回-1。


注意:


1.wait/waitpid接口都是等待一个子进程退出,但是如果在调用接口等待的时候,已经有子进程退出了,则会直接进行处理退出的子进程,处理完毕,接口返回。


2.waitpid的非阻塞使用时,一定要循环操作,否则操作就有可能没有完成,依然可能产生僵尸进程。


四、程序替换


1.相关概念


1.1程序


程序就是一堆静态的指令和数据,运行的时候被加载到内存种,然后系统创建pcb管理程序的运行。


创建一个进程,就是创建了一个pcb,子进程复制了父进程,所以运行的代码和父进程是一样的。这样就可以分摊任务处理压力,但主要目的是进程替换,让子进程管理另一个程序的运行。


1.2程序替换原理


将一个新的程序加载到内存中,然后改变一个进程的页表映射信息,将其更改到新的程序的指令和数据上,这时当前的pcb管理的就不再是原来的程序运行,而是一个新的程序。


1.3程序替换目的


进行程序替换,让一个进程运行指定的程序,完成对应的功能,常用于子进程的替换。


2.相关操作函数


2.1exec函数簇

extern char **environ;


int exece(const char *path,char *const argv[],char *const envp[]);系统调用接口


const char *path:要加载替换的新程序的文件路径名称


char *const argv[]:程序的运行参数


char *const envp[]:进程的环境变量


以下五个函数是对系统调用接口的封装:


int execl(const char *path,const char *arg,....)


path:待路径的新程序名称


arg:参数,是一个不定参


int execlp(const char *file,const char *arg,....)


file:不带路径的新程序名称,在path环境变量指定的路径下去找程序,常用于指令程序的替换。


int execle(const char *path,const char *arg,....,char * const envp[])


path:带路径的新程序名称


arg:参数


envp:环境变量


int execv(const char *path,char * const argv[])


与execl类似,区别是参数不是一个一个给,而是组织成为一个字符指针数组一次性给。


int execvp(const char *file,char * const argv[])


对标execlp,在指定路径下寻找程序,参数通过数组给定。


函数簇特点区分:


l和v的区别,在于参数是一个一个给,还是组织成为数组一次性给;


有没有p的区别,在于是否会默认到path环境变量指定的路径下找程序;


有没有e的区别,在于是否需要自定义环境变量。


相关文章
|
2月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
109 1
|
3天前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
50 34
|
7天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
39 16
|
1月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
117 20
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
121 13
|
2月前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
3月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
219 4
linux进程管理万字详解!!!
|
2月前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
3月前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
3月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
107 8