首页 > 系统相关 >操作系统进程-概述、fork/vfork、exit/_exit、getpid/getppid、wait/waitpid与exec族函数的介绍

操作系统进程-概述、fork/vfork、exit/_exit、getpid/getppid、wait/waitpid与exec族函数的介绍

时间:2025-01-18 15:33:55浏览次数:3  
标签:fork const exec int char exit 进程 include

进程

基本概念

什么是进程:

进程是程序的一次执行过程,进程是程序执行和资源管理的最小单元。在Linux环境下,每个正在运行的程序都被称为进程

并行与并发:

  • 并行(微观上,一个很短时间范围内):在很短的时间段内(时间点上),两个事情同时发生
  • 并发(宏观上,一个时间段内):在一段时间内,多个事情同时发生(实际上多个事情有先后顺序)
    • 服务器并发访问,应用程序并发执行

什么是进程控制块(PCB):

进程是Linux系统中调度和管理资源的单位,系统通过进程控制块来描述和表示一个进程的变化

进程控制块包括的内容:

进程的描述信息(进程ID,进程状态…)

进程控制信息(调度信息,时间片,优先级…)

进程的资源信息(内存资源,打开的文件,使用的定时器…)

Linux系统中进程控制块中的每一项都是通过task_struct结构体来表示,定义在#include <linux/sched.h>头文件中

进程控制称为PCB,它是一个复杂的数据结构,在管理一系列的结构体和结构体成员指针指向的内存空间;

一个进程在执行时处于不同的状态:创建—就绪—运行—阻塞—销毁

进程的特征:

  • 并发性:多个进程可以在同一时间运行在一个内存空间中,任何进程都可以同其他进程并发执行
  • 动态性:进程在不同状态间不断的切换(非静态)
  • 独立性:进程之间默认是独立运行的,互不相干
  • 异步性:进程间运行时,按照不同的速度和时间在运行,在微观层面不是同时的,甚至是制约的,不可预知的顺序执行

进程的基本操作

fork

调用头文件

#include <unistd.h>

函数原型

pid_t fork(void);

功能

创建子进程

无参数

返回值

fork函数调用一次,返回两次。父进程中,fork返回新创建的子进程的PID;子进程中,fork返回0;出错时,返回-1,提供错误码,可以使用perror。

vfork

调用头文件

#include <unistd.h>
#include <sys/types.h>

函数原型

pid_t vfork(void);

功能

创建子进程

无参数

返回值

vfork函数调用一次,返回两次。父进程中,vfork返回新创建的子进程的PID;子进程中,vfork返回0;出错时,返回-1,提供错误码,可以使用perror。

forkvfork都能创建进程

他们的区别:

  • fork创建的子进程拷贝了父进程的所有虚拟内存(栈、堆、代码段、数据段);父子进程执行先后顺序不确定,结束的先后顺序也不确定

  • vfork创建的子进程共享了堆栈空间;子进程先执行先结束,父进程在子进程结束后才执行,父进程后结束

    • 子进程先结束,就会清理共享的堆栈空间,导致父进程无法在访问堆栈中的数据,程序会报"核心已转储"的错误

      解决方法:在子进程代码最后调用_exit函数,该函数会终止当前进程并且不会清理 堆栈空间,从而不会报错

exit与_exit

调用头文件

#include <unistd.h>
#include <stdlib.h>

函数原型

void exit(int status);
void _exit(int status);

功能

退出,或终止进程

参数

  • status:退出码/退出的状态值

    EXIT_FAILURE 1

    EXIT_SUCCESS 0

返回值(无)

exit_exit都能退出进程

他们的区别:

_exit会直接终止进程

特性exit_exit
清理函数执行
标准IO缓冲区刷新
释放标准库资源
使用场景正常程序退出子进程或紧急退出
标准库依赖性依赖标准库不依赖标准库
getpid与getppid

调用头文件

#include <unistd.h>
#include <sys/types.h>

函数原型

pid_t getpid(void);
pid_t getppid(void);

功能

getpid:获取当前进程ID

getppid:获取当前进程父进程ID

参数(无)

返回值

getpid:返回当前进程

getppid:返回当前进程父进程ID

wait与waitpid

调用头文件

#include <sys/types.h>
#include <wait.h>

函数原型

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

功能

wait:阻塞父进程,直到某个子进程退出

waitpid:阻塞调用程序,直到编号为pid的子程序退出

参数

  • status:获取到的子进程结束状态值,获取到status后用WEXITSTATUS(status)来转换子进程退出时的退出码

  • pid:等待的子进程ID

  • options:附加选项(一般填0)

    WEXITED /Wait for children that have terminated.

    WSTOPPED /Wait for children that have been stopped by delivery of a signal.

    WCONTINUED /Wait for (previously stopped) children that have been resumed by delivery of SIGCONT.

    The following flags may additionally be ORed in options:
    WNOHANG /As for waitpid().
    WNOWAIT /Leave the child in a waitable state; a later wait call can be used to again retrieve the child status information.

返回值

成功返回退出子程序的ID,错误返回**-1**

exec族函数

exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容(在调用进程内部执行一个可执行文件。)

一个进程调用exec族函数后,代码段,数据段,堆段,栈段的都会被新程序覆盖,保留PID(进程号)

exec函数族调用的头文件都是以下:

#include <unistd.h>
execl

函数原型

int execl(const char *path,const char *arg,...);
int execlp(const char *file,const char *arg,...);
int execle(const char *path,const char *arg,...);

功能

用path或者file指定的进程地址空间替换调用进程的地址空间

参数

  • path:执行程序的全路径
  • file:执行程序的名称
  • arg,…:被执行程序所需的命令行参数,含程序名。以空指针结束

返回值

错误时返回-1,提供错误码,可以使用perror**(只有错误才返回)**

execv

函数原型

int execv(const char *path,char *const argv[]);
int execvp(const char *flie,char *const argv[]);
int execve(const char *path,char *const argv[],char *const envp[]);

功能

用path或者file所指定的进程地址空间替换调用进程的地址空间

参数

  • path:执行程序的全路径
  • file:执行程序的名称
  • argv:被执行程序所需的命令行参数,含程序名。以空指针结束
  • envp:指向环境参数的数组

返回值

错误时返回-1,提供错误码,可以使用perror**(只有错误才返回)**

system

调用头文件

#include <stdlib.h>

函数原型

int system(const char *command);

功能

相当于命令行运行command指令

参数

  • command:想要在命令行实现的指令字符串

返回值

  • command为NULL,如果shell存在返回非零值,如果不存在返回0;
  • 出错返回-1;
  • 成功返回终端状态
system("./abc &");

&在system中表示后台运行abc这个程序

想要杀死后台的程序,需要使用

killall "进程名称"
或者
kill -9 "进程号"

不能使用ctrl+c(只能终止前台进程)

要获取进程号,可以使用

ps -aux | grep "进程名称"

标签:fork,const,exec,int,char,exit,进程,include
From: https://blog.csdn.net/Are_pro_bald/article/details/145227927

相关文章

  • fork函数写时拷贝
    fork函数写时拷贝        当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID。为了给这个新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的原样副本。它将两个进程中的每个页面都标记为只读,并且把两个进程中的每个区......
  • Issac Gym出现error: subprocess-exited-with-error报错
    1.前言一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。如有不对之处,欢迎评论区指出错误,你我共同进步学习!2.正文我在安装humanoidgympipinstall-e.的时候,出现下列问题:解决方法:pipinstall--upgradesetuptools没解决就先卸载setuptools,再直接安......
  • docker containner挂掉,无法exec进入bash,如何修改文件的终极解决方法.210730
    场景:Nginx在bash里面配置的时候挂掉了,然后dockerstart不起来,execbash进不去,造成无法再改里面的文件了解决方法:1,dockerps–a可以查到所有docker,包括没有运行的,找到containnerID[root@hecs-29489~]#dockerps-aCONTAINERIDIMAGECOMMANDC......
  • C3工具 cexec
    1、安装rpm-ivh--forcec3-5.1.2-1.noarch.rpmyuminstall-yexpect-5.44.1.11-1.241.1.x86_64.rpm2、配置sshd互信catipList.cnf10.0.0.2610.0.0.2710.0.0.28shGbase_03_Tool_SSHNoPassLogin.shroot1234563、C3配置clustercoor#cluster主机配置c......
  • Executor建立线程示范代码java
    importjava.util.concurrent.Executor;publicclasstest{publicstaticvoidmain(String[]args)throwsInterruptedException{SubExecutorsubExecutor=newSubExecutor();subExecutor.execute(newTicketStation(200));subExecutor......
  • Java 线程池 ThreadPoolExecutor
    引言在多线程编程中,ThreadPoolExecutor是Java平台提供的一个强大工具,它允许开发者通过管理一组预先创建的线程来执行任务,从而提高了应用程序的性能和资源利用率。本文将深入探讨ThreadPoolExecutor的工作原理,并结合实际案例说明如何正确配置和使用线程池。一、线程池......
  • Java 线程池 ThreadPoolExecutor 底层原理与源码分析
    引言我们探讨了ThreadPoolExecutor的基本概念、内部机制以及部分源码实现。本文将继续深入研究该类的更多细节,并结合提供的文档内容,进一步解析线程池的工作流程、任务提交和执行的具体过程,以及如何通过自定义配置来优化性能。一、线程池的任务提交与执行1.1execute()......
  • 安卓编译报错Execution failed for task ‘:expo-modules-core:prepareBoost‘. Not i
    作者:Kovli重要通知:红宝书第5版2024年12月1日出炉了,感兴趣的可以去看看,https://u.jd.com/saQw1vP红宝书第五版中文版红宝书第五版英文原版pdf下载(访问密码:9696)报错如下[RUN_GRADLEW]Executionfailedfortask':expo-modules-core:prepareBoost'.[RUN_GRADLEW]>Cou......
  • sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的
    文章目录引言I基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表seealso:监视SQLServer内存使用量资源信号灯DMVsys.dm_exec_query_resource_semaphores(确定查询执行内存的等待)引言查询历史数据库客户端ip应......
  • wx.exitVoIPChat
    wx.exitVoIPChat(Objectobject)基础库2.7.0开始支持,低版本需做兼容处理。以Promise风格调用:支持小程序插件:支持,需要小程序基础库版本不低于2.9.0微信Windows版:支持微信Mac版:支持相关文档:多人音视频对话功能描述退出(销毁)实时语音通话参数Objectobjec......