如何创建进程
标签: linux
进程的不同状态:
- 执行态(RUNNING):进程正在占有CPU。
- 就绪态(RUNNING): 进程处于等待队列中等待调度。
- 挂起态/睡眠态:
浅睡眠(INTERRUPTABLE):此时进程在等待一个事件的发生或某种系统资源,可响应信号。
深睡眠(UNINTERRUPTABLE):此时进程在等待一个事件的发生或某种系统资源,无法响应信号。 - 停止态(STOPPED):此时进程被暂停。
- 僵尸态(ZOMBIE):此时进程不能被调度,但是PCB未被释放。
- 死亡态(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); // 将本进程挂起,直到收到一个信号
智能推荐
进程二(进程的创建)
创建进程 创建进程的一般工作: 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和...
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...
