进程常用指令 (从创建到回收 包含守护)

                                                                                进程

 

                          常用命令及基本介绍

 

ps -ef 查看所有进程信息 (一般需要配合管道使用)

ps aux 查看进程信息 且显示进程状态

状态:

R 运行态 正在运行或可运行

D 等待态 不可中断

S 等待态 可中断

T 停止态

Z 僵尸态

可追加:

+ 前台运行

< 高优先级进程

N 低优先级进程

top 动态的查看进程的信息及状态 每隔3秒刷新一下 且能根据CPU的占用情况从大到小排序

 

/proc 目录中存放着一些进程相关文件

status 文件中存放进程信息

fd 目录中 存放进程打开的所有文件的信息

 

nice -n number +./执行文件名 作用是修改进程的优先级 (number 为设定优先级的大小 范围为-20 ~ 19 19最低)

 

renice -n number +进程号 作用是一般用于修改已有进程的优先级 (number的作用同上)

 

普通用户只能降低优先级 不能拉高优先级

ROOT用户 可以降低优先级也可以拉高优先级

jobs 显示当前所有后台进程及信息 并对其编号排序

 

fg +排序号(jobs的排序号) 把相应的后台进程转成前台进程

 

Ctrl +z 让前台运行进程转成挂起进程(停止态)

bg +排序号 让挂起进程转成后台运行进程

 

                                                创建进程

 

 

创建进程函数

#include<unistd.h>

pid_t fork(void);

失败返回-1

如果成功 父进程返回子进程的进程号 子进程返回0

 

int getpid(void) 返回进程号

 

子进程继承了父进程几乎所有内容 但不是全部

父子进程都有自己独立的空间

 

若父进程先结束

子进程成为孤儿进程 被init进程收养 (也就是说它的父进程变为init进程)

子进程变成后台进程

 

若子进程先结束

父进程如果没有及时回收 子进程会变成僵尸进程

 

子进程是在fork()函数之后的下一条语句开始执行

子进程被创建后 父子进程谁先执行? 系统先调用谁 谁就先执行 (如果没有发生进程调度 则父子进程都有可能先执行)

父进程能否多次调用fork()函数? 可以 理论上不受影响

子进程能否多次调用fork()函数? 可以 理论上不受影响

 

结束进程

#include<stdlib.h>

#include<unistd.h>

void exit(int status)

void _exit(int status)

都会结束当前进程 并返回status

exit()结束进程时 会刷新缓冲区(流)

 

 

                                                  exec函数族

 

进程调用exec函数族执行某个程序

进程当前程序被执行程序替换

让父子进程执行不同的程序

父进程创建子进程

子进程调用exec函数族·

父进程不受影响

 

#include<unistd.h>

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

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

 

成功则执行指定程序 失败则返回EOF

path 执行的程序的名称 包含路径

arg.... 传递给程序的参数

file 执行的程序的名称 不含路径 需要在PATH环境变量中查找

 

#include<unistd.h>

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

int execvp(const char *file, char *const srgv[],....)

成功执行指定程序 失败返回EOF

arg....封装成指针数组的形式

 

Ps:char *arg[]= {"ls","-a", "-l", "/etc", NULL};

if(execv("/bin/ls", arg) < 0)

{

perror("execv");

}

 

#include <stdlib.h>

int system(const char *command)

成功返回command命令的返回值 失败返回EOF

函数的实现过程 是 先创建一个子进程 然后system()在子进程中执行命令 父进程需要等待子进程执行完之后才能继续执行

 

                                     进程回收

 

子进程结束时 由父进程回收

孤儿进程 由init进程回收

如果没有及时回收 那么就会变成僵尸进程 直到其父进程执行结束 僵尸进程才会被init进程回收

 

进程回收函数

#include<unistd.h>

pid_t wait(int *status)

成功返回被回收的子进程的进程号 失败返回EOF

如果子进程没有结束 父进程会一直处于阻塞状态

若有多个子进程 哪个先结束 哪个先被回收

status用于保存子进程返回值和结束方式的地址

status 如果为NULL 表示直接释放子进程的pcb 不接收返回值

 

子进程正常结束的三种方式 exit / _exit / return 这三种都会返回一个值(0-255)

父进程调用wait(status)进行回收

WIFEEXITED(status) 可通过这个宏定义判断这个子进程是否是正常结束

WEXITSTATUS(status) 获取子进程返回值

WIFSIGNALED(status) 判断子进程是否是被信号结束

WTERMSIG(status) 获取结束子进程的信号类型

 

status这个变量中 第0位到第6位存放子进程结束类型 如果为0 说明正常结束 非零说明被信号结束

第8位到第15位存放子进程结束的返回值

 

 进程回收函数

#include <unistd.h>

pid_t waitpid(pid_t pid, int *status, int option)

参数pid 是指定回收的对象 (如果不想指定 值设为-1即可)

参数option 是指定回收的方式 0或WNOHANG

option为0 如果子进程尚未结束 父进程则一直处于阻塞状态 等待其结束 并将其回收

option为WNOHANG 如果子进程尚未结束 父进程不会一直阻塞 waitpid会返回0 代表子程序没结束

如果子程序结束了 waitpid会返回进程号 代表回收成功

成功则返回子进程的进程号或0 失败返回EOF

如果返回进程号 说明回收成功

如果返回0 说明子进程还没结束 并不代表回收失败

如果返回EOF 说明没有子进程

 

                                                守护进程

 

守护进程通常在系统启动时运行 系统关闭时 结束

在linux系统中大量使用 很多服务程序以守护进程形式运行

 

特点:

始终在后台运行

独立于任何终端

周期性的执行某种任务或等待处理特定事件

 

linux以会话和进程组的方式管理进程

每一个进程都属于一个进程组

会话是一个或多个进程组的集合 通常用户打开一个终端时 系统会创建一个会话 所有通过该终端运行的进程都属于这个会话

一个会话最多只能打开一个终端(也可以不打开)

当某个终端结束时 所有相关的进程都会被结束

 

 

          守护进程的创建

 

1. 创建子进程 父进程退出

此时该子进程会成为孤儿进程被init进程收养 且在后台运行

并且该子进程依然依附于终端 一旦终端关闭子进程会被结束

(此时进程还不属于守护进程)

 

2. 在子进程中 创建新会话

实现函数 setsid()

该子进程成为会话组组长

且不再依赖于原先终端

 

3. 更改当前工作目录

可更改为

chdir("/")(这是根目录 普通用户的权限是只读 可执行 不可写)

或 chdir("/tmp")(所有的用户在该目录下都是可读可写可执行)

更改目录的原因:守护进程一直在后台运行 其工作目录是不可被卸载的 所以创建守护进程时 需 要把子进程的工作目录更改到一个永远不会被修改的目录中

 

4.重设文件权限掩码

实现函数 umask(number) number为设定的掩码 一般为0 代表不会屏蔽任何权限位

重新设定的掩码只会对当前进程有效 不会影响其他进程

5 关闭打开的文件描述符

因为子进程会继承父进程的一些文件 所以在这里需要把这些文件关闭掉

实现函数 getdtablesize() 作用获取文件个数

int i;

for(i=0; i<getdablesize();i++)

close(i);

已脱离终端 stdin /stdout / stderr 无法使用

 

Like:

创建守护进程 每隔1秒 将系统时间写入到time.log文件中

 

code:

int main()

{

pid_t pid;

FILE *fp;

time_t t;

int i;

 

if((pid = fork() < 0)

{

perror("fork");

exit(-1);

}

else if(pid > 0)

exit(0);

 

setpid();//创建新会话

umask(0); //重设文件掩码

chdir("/tmp"); // 更改文件目录

 

for(i =0 ;i < getdablesize(); i++) //关闭继承的父进程的文件

close(i);

 

if((fp = fopen("time.log", "a")) == NULL)

{

perror("fopen");

exit(-1);

}

 

while(1)

{

time(&t);

fprintf(fp, "%s", ctime(&t));

fflush(fp);

sleep(1);

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VS C++ 2010】查看内存的方法详解

1 示例代码 对于以下代码&#xff1a; int main() {int a 100010001000;int b 100;cout << "a " << a << " " << &a << endl;cout << "b " << b << " " << &b…

二级C选择知识点(部分)

二级C 循环队列是队列的顺式存储结构 双向链表是链表的顺式存储结构 普通链表是链式存储结构 非线性结构可采用顺式也可采用链式 线性结构是只有一个根结点 每个节点最多有一个 带链队列可以不连续 且队头指针可大于也可小于队尾指针 在链表中 双向链表和循环链表都有两个…

【汇编语言】上机实验 win7/8/10 64位系统 进入32位DOS模式 实现dubug/edit/masm/link功能

1 软件下载和安装 下载并安装DOSBox软件&#xff0c;注意&#xff0c;不要装在C盘上&#xff0c;装在其他盘上 【备注】软件直接百度搜索即可下载Debug.exe文件 【备注】百度搜索“Debug 64位 下载” 对于下载后得到的debug.exe文件 将这个文件拷贝到磁盘根目录下&#xff0c…

ntohs(), ntohl() , htons(), htonl(), inet_ntoa(), inet_pton(), atoi()汇总

在C/C写网络程序的时候&#xff0c;往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs()&#xff0c;htons()这4个函数。 网络字节顺序与本地字节顺序之间的转换函数&#xff1a; htonl()--"Host to Network Long" ntohl()--"N…

【数字逻辑 Verilog】全面剖析数据选择器——从基础到拓展,从理论到设计的实现,从表面到本质

0 前言 0.1 使用环境 EDA工具&#xff1a;Vivado 2017.4硬件描述语言&#xff1a;Verilog HDL 0.2 涉及知识 数字逻辑Verilog 1 基础模块&#xff1a;一位四选一数据选择器 1.1 设计部分&#xff1a;层次建模 1.1.1 需求分析 设计一个一位的四选一数据选择器&#xff0…

exec函数族(部分 最常用的)

进程调用exec函数族执行某个程序 进程当前程序被执行程序替换 让父子进程执行不同的程序 父进程创建子进程 子进程调用exec函数族 父进程不受影响 #include<unistd.h> int execl(const char *path, const char *arg, ...) int execlp(const char *file, const cha…

【计算机网络】手动配置hosts文件解决使用GitHub和Coursera网站加载慢/卡的问题

目录0 前言1 打开hosts1.1 以管理员身份运行记事本1.2 打开hosts2 找到实际地址2.1 打开cmd2.2 找到网址3 替换地址3.1 修改hosts文件3.2 刷新4 后续内容的完善0 前言 本文是针对纯小白读者&#xff0c;没有涉及到任何的专业知识&#xff0c;你只需要按照步骤操作即可。 同时…

【汇编语言】镜像迁移能力之一通百通——由代码段和CS:IP的原理,掌握一类寄存器的使用

0 前言 你应该知道8086CPU的物理地址形成方式及其原理&#xff0c;才能完成本文的学习。 1 内存的分段 对于内存&#xff0c;人们人为地将其划分为一段一段的&#xff0c;比如代码段和数据段等&#xff0c;特别注意&#xff0c;这是人为划分的结果&#xff0c;方面人类使用&…

线程间通信————同步

同步 是指多个任务按照约定的先后次序 相互配合完成一件事情 信号量&#xff1a; 由信号量决定 线程是继续执行 还是阻塞等待 信号量代表某种资源 其值表示系统中该资源的数量 信号量是一个受保护的量 只能通过特定的三种操作来访问 初始化 P操作&#xff08;申请资源&…

【计算机组成原理 数字逻辑 Verilog】32位加法器的实现:支持整数的加减运算

目录0 前言0.1 使用环境0.2 知识点0.3 注意事项1 建模&#xff1a;1位加法器1.1 构建基础模型1.1.1 一位加法器1.1.1.1 科技黑箱&#xff1a;外部端口与功能1.1.1.2 揭秘黑箱&#xff1a;内部结构与模块1.1.2 从顶层模块提取低层模块&#xff1a;取反功能选择器1.1.2.1 科技黑箱…

线程间通信————互斥

互斥 临界资源 一次只允许一个任务&#xff08;进程&#xff0c;线程)访问的共享资源 临界区 访问临界资源的代码 互斥机制 mutex互斥锁 任务访问临界资源前申请锁 访问完后释放锁 互斥锁初始化 #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mute…

【Verilog HDL】门级描述 / 数据流描述 / 行为级描述——通过四选一多路选择器,实现对于不同层级描述方式的整体性认知

目录0 前言1 输出端口的设计1.1 门级描述和数据流描述1.2 行为级描述2 三种描述方式的整体架构2.1 门级描述2.2 数据流描述2.3 行为级描述2.4 补充&#xff1a;独立的语句2.5 小结3 理解三种描述方式的本质3.1 门级描述3.2 数据流描述3.3 行为级描述4 理解不同抽象层级描述方式…

线程创建-结束-回收 教程

ps aux -L 查看线程信息 且显示进程状态 使用进程的缺点: 进程切换 系统开销较大 开销大的原因 &#xff1a;切换时需要频繁刷新 cache(类似于缓冲区) 和TLB linux不区分线程 进程 线程其实也属于进程 只不过是特殊的进程 是一种可以共享地址空间的进程 使用线程的优点&#x…

【汇编语言】汇编实验IDE(集成开发环境):RadASM的安装和使用说明

0 前言 本文适合8086CPU的指令集。 对于重要的专业基础课程&#xff0c;汇编语言&#xff0c;做实验是必不可少的&#xff0c;但是由于汇编语言本身的缺陷&#xff0c;现代计算机并不能直接运行汇编语言程序&#xff0c;因此&#xff0c;一般老师会要求我们 使用虚拟机&…

【汇编语言】理解8086CPU中,不同类型的寄存器和汇编指令规则的联系(会继续更新)

0 前言 你是否因为汇编指令繁杂的规则而苦恼呢&#xff1f;作者本人也很烦&#xff0c;因为往往教材中只告诉我们规则&#xff0c;却不告诉我们为什么&#xff0c;没有原因就直接记忆&#xff0c;负担太大&#xff0c;后期灵活运用也增添阻力&#xff0c;因此&#xff0c;我经…

System V IPC之信号灯

信号灯也叫信号量 用于进程/线程同步或互斥的机制 信号灯的类型 1.Posix 无名信号灯 2.Posix 有名信号灯 3.System V 信号灯 信号灯的含义 计数信号灯&#xff08;1和2都是&#xff09; System V信号灯是一个或多个计数信号灯的集合&#xff08;可操作集合中的多个信号灯&…

【VS 2017 C语言 汇编语言】如何使用VS 2017,通过反汇编查看C语言代码对应的32位x86汇编语言 VS 2017单步调试的使用

0 前言 本文适用于VS的大多数版本&#xff0c;本文以VS 2017为例进行讲解。 1 编辑C语言代码 首先&#xff0c;在VS编译器中&#xff0c;创建项目&#xff0c;敲一段C语言代码&#xff0c;这个过程不解释了&#xff0c;如果不会请百度。 #include <stdio.h> #include…

System V IPC之共享内存

共享内存是一种最为高效的进程间通信方式&#xff0c;进程可以直接读写内存&#xff0c; 而不需要任何数据的拷贝 共享内存在内核空间创建&#xff0c; 可以被进程映射到用户空间访问 由于多个进程可同时访问共享内存 &#xff0c; 因此需要同步和互斥机制配合使用 共享内存的使…

【汇编语言】结合C语言,使用VS 2017调试模式下的反汇编工具学习32位x86汇编指令

0 前言 简要说明x86系列指令集的整体概况与变化。 我给到你补充学习内容&#xff1a;使用VS学习汇编语言的教程 1 8086CPU到现代CPU的变化 做一些了解即可&#xff0c;不是绝对的&#xff0c;取决于设计工艺以及用途&#xff0c;不同计算机不一样也正常。 1.1 CPU位数与地…

System V IPC之消息队列

消息队列由消息队列id来唯一标识 消息队列就是一个消息的列表 用户可以在消息队列中添加消息 读取消息 消息队列可以按照类型来发送和接收消息 消息队列使用步骤 打开/创建消息队列 msgget 向消息队列发送消息 msgsnd 从消息队列接收消息 msgrcv 控制消息队列 msgctl 创建/打开…