如何创建进程

标签: linux

进程的不同状态:

  1. 执行态(RUNNING):进程正在占有CPU。
  2. 就绪态(RUNNING): 进程处于等待队列中等待调度。
  3. 挂起态/睡眠态:
    浅睡眠(INTERRUPTABLE):此时进程在等待一个事件的发生或某种系统资源,可响应信号。
    深睡眠(UNINTERRUPTABLE):此时进程在等待一个事件的发生或某种系统资源,无法响应信号。
  4. 停止态(STOPPED):此时进程被暂停。
  5. 僵尸态(ZOMBIE):此时进程不能被调度,但是PCB未被释放。
  6. 死亡态(DEAD):这是一个已终止的进程,且PCB将会被释放。

进程状态

在这里插入图片描述

1.进程的创建

  • pid_t fork(void); // 创建一个进程
  • pid_t getpid(void); // 获取当前进程号(ID)
  • pid_t getppid(void); // 获取父进程号(ID)

2.进程的回收

  • pid_t wait(int *wstatus); // 阻塞回收一个子进程

  • pid_t waitpid(pid_t pid, int *wstatus, int options); // 不阻塞回收一个子进程

     options参数:
     WCONINUED:报告任意一个从暂停态出来且从未报告过的子进程的状态
     WNOHANG:非阻塞等待
     WUNTRACED:报告任意一个当前处于暂停态且从未报告过的子进程的状态
    

3.进程的退出

  • void exit(int status); // 退出
  • void _exit(int status); // 退出
  • void _Exit(int status); // 退出
  • return // 只能返回调用处

在这里插入图片描述

处理子进程退出状态值的宏

 - WIFEXITED(status);// 如果子进程正常退出,则该宏为真
 - WEXITSTATUS(status);//如果子进程正常退出,则该宏将获取子进程的退出值
 - WIFSIGNALED(status);//如果子进程被信号杀死,则 该宏为真
 - WTERMSIG(status);  // 如果子进程被信号杀死,则该宏获取导致它死亡的信号值
 - WCOREDUMP(status); // 如果子进程被信号杀死且生成核心转储文件,则该宏为真
 - WIFSTOPPED(status); // 如果子进程被信号暂停,且option中WUNTRACEDye'i
 - WSTOPSIG(status); // 如果WIFSTOPPED(status)为真,则该宏将获取导致子进程暂停的信号值
 - WIFCONTINUED(status); // 如果子进程被信号SIGCONT重新置为就绪态,则该宏为真

4.进程的执行

  • int system(const char *command); // 指定执行某个程序,会多出一个进程,与llinux操作终端一样

  • exec函数族(专门用于程序执行)
    int execl(const char *path, const char arg, …
    /
    (char *) NULL */);
    int execlp(const char *file, const char arg, …
    /
    (char *) NULL */);
    int execle(const char *path, const char arg, …
    /
    , (char *) NULL, char * const envp[] */);
    int execv(const char *path, char *const argv[]);
    int execvp(const char *file, char *const argv[]);
    int execvpe(const char *file, char *const argv[],char *const envp[]);

     前4位:exec
     第5位:(2选1)
     l	:list以列表形式,进程传参
     v	:vector以指针数组形式,进程传参
     第6位:(可以不写,可以全写)
     p	:path 可执行文件路径
     e	:environment传参时指定环境变量路径
    

    说明:执行该函数,不会产生新的进程,只会替换当前进程内的内容。一般专门创建一个子进程给exec用于执行某个程序。

5.进程信号的发送/接受

发送信号

  • int kill(pid_t pid, int sig); // 给指定进程号发送某个信号
  • int raise(int sig); // 自己给自己发送某个信号

接送信号

  • void(*signal(int sig, void (*func)(int)))(int); // 捕捉一个指定的信号,即预先为某信号的到来做准备

     func参数:
     SIG_IGN:忽略
     SIG_DFL:默认状态
     void (*p)(int): 注册响应函数
    

挂起进程

int pause(void); // 将本进程挂起,直到收到一个信号

版权声明:本文为qq_48726729原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_48726729/article/details/108057689

智能推荐

进程二(进程的创建)

创建进程 创建进程的一般工作: 1.分配pid 0号进程是内核进程,他创建1号进程 0号进程还将进程从物理内存搬到磁盘,和从磁盘搬到物理内存 2.分配PCB拷贝父进程PCB的巨大多数数据 3.给子进程分配资源 4.复制父进程地址空间 5.将子进程置为就绪状态,放入就绪队列 一system system函数:该函数的作用是,运行义字符串参数的形式传递给他的命令并等待该命令的完成(如果无法启动shel...

进程控制_进程创建

linux中的fork函数,用来给当前进程中创建一个新进程,新进程为子进程,原进程为父进程 Fork运行规则 : 以父进程为模板,创建子进程 进程调用fork后,内核做的事 分配新的内存块和内核数据结构给子进程 将父进程部分数据内容拷贝至子进程 添加子进程到系统进程列表中 fork返回,开始调度器调度 子进程会拷贝父进程的数据作为自己的 将父进程的PCB拷贝,并稍加修饰,成为子进程的PCB 将父进...

进程之进程的创建

什么是进程? 进程是一个正在执行的程序的实例。 进程由哪些元素组成? ➢程序的当前上下文,程序当前的执行状态 ➢程序的当前执行目录 ➢程序访问的文件和目录 ➢程序的访问权限 ➢内存以及其他分配给进程的系统资源 进程的属性 进程号(PID) 父进程号(PPID) 进程名 用户 cpu% 内存% 优先级 开启时间等 进程最重要的属性是进程号(PID) ,以及父进程号(PPID) 。一个进程有唯一的进程...

Python+Selenium+Autolt选择本地文件上传至网站

如果网站有上传文件的功能,selenium不提供对本地元素的定位,如何使用python选择本地文件进行上传呢 可以使用Autolt工具上传文件: 1、下载网址:https://www.autoitscript.com/site/autoit/downloads/ 2、点击“Downlad ZIP”下载 3、解压缩下载的ZIP文件 4、打开脚本编辑器文件夹,有一个SciTE....

数据结构系列之一-线性表

数据结构系列--线性表 慧子和她的3D 慧子和她的3D      暑期工作搞不下去,不如趁着现在整块时间搞编程。学习资料书《大话数据结构》,前面两章的铺垫感性知识,看看过,从第三章开始正餐。 01 — 线性表 线性表:零个或多个数据元素的有限序列。用数学语言表达:       ...

猜你喜欢

Linux系统的远程操作练习

目录 一、将虚拟机Ubuntu系统的网络连接设置为“桥接模式”,并配置Ubuntu的IP、网关参数 二、在win10系统下用putty登录ubuntu系统 三、VNC server VNC viewer 思考 一、将虚拟机Ubuntu系统的网络连接设置为“桥接模式”,并配置Ubuntu的IP、网关参数 1.打开虚拟机,进入设置 点击网络适配器,选择桥...

ORACLE----TimeStamp(时间戳)自动更新

之前对id的自增长进行了设置,原以为时间戳的更新也类似,使用序列之类的,但最终发现跟序列没半毛钱关系。触发器是肯定要用的,但编写脚本也是需要的。 (1)创建触发器 图2中,我们要选择事件(即例子中的INSERT,UPDATE),触发时间(即INSERT,UPDATE事件的前或后,例子中是before),列(例子中为MODIFIED_DATE,为TimeStamp类型),新旧值(为系统默认值OLD和...

数字图像处理:对数变换

设置窗口大小的函数: namedWindow("窗口名", 0); resizeWindow("窗口名", width, height);...

LeetCode(剑指offer-tree)-面试题26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 树的遍历方式为:前序遍历 给定的树 A: 给定的树 B: 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。 示例 1: 示例 2: 限制: 题源链接:https://leetcode-cn.com/problems/shu-de-z...

大数据笔记14:Zebra项目分析与实施

第14天——Zebra项目分析与实施 第一部分 Zebra项目概述 一、Zebra项目介绍 二、日志数据结构分析 三、数据以| 分割后,每个数据项的含义 四、Zebra项目整体架构 (一)技术架构 (二)工程架构 五、Zebra业务说明 六、Zebra项目设计思想 第二部分 Zebra项目实施过程 一、创建Maven项目ZebraProject 二、zebra_jobtra...