二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识
21.1 进程查看和进程状态
21.1.1 ps 指令
ps 指令通常可以查看到进程的 ID、进程的用户 ID、进程状态和进程的 Command
ps:查看当前用户启动的进程

ps -ef:详细查看后台进程信息,可以用 ps -ef | more 进行分屏查看

ps -aux:当前运行的进程占用的CPU的时间,内存的时间

- USER:进程的属组
- PID:进程的ID
- PPID:父进程
- %CPU:进程占用的CPU百分比
- %MEM:占用内存的百分比
- NI:进程的 NICE值,数值大,表示较少占用CPU的时间
- VSZ:进程虚拟大小
- RSS:驻留中页的数量
- TTY:终端ID
- WCHAN:正在等待的时间
- START:启动进程的时间
- STAT:进程的状态
- TIME:进程消耗CPU的时间
- COMMAND:命令的名称和参数
21.1.2 进程状态
- linux上进程有5种状态:
- 运行(正在运行或在运行队列中等待)
- 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) ---可中断等待状态
- 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)---不可中断等待状态
- 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
- 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
- ps工具标识进程的5种状态码:
- D 不可中断 uninterruptible sleep (usually IO)
- R 运行 runnable (on run queue)
- S 中断 sleeping
- T 停止 traced or stopped
- Z 僵死 a defunct ("zombie") process
注: 其它状态还包括W(无驻留页), <(高优先级进程), N(低优先级进程), L(内存锁页).
21.2 进程调度和进程状态变化
21.2.1 进程调度
进程如何进行调度:
- 第一步:处理内核中的工作
- 第二步:处理当前进程
- 第三步:选择进程
- 实时进程
- 普通进程
- 第四步:进程交换
启动进程之后,会启动一个 task_struct 结构体,在此结构体中会存储进程调度的一些信息。task_struct 中的调度信息:
- 策略
- 轮流策略
- 先进先出策略
- 优先权
- Jiffies 变量
- 实时优先权
- 实时进程之间
- 计数器
21.2.2 进程状态变化关系

21.3 进程标识
内核通过 PID 来区分不同的进程
#include <unistd.h>
#include <sys/types.h> pid_t getpid(void); //获得当前进程ID
uid_t getuid(void);//获得当前进程的实际用户ID
uid_t geteuid(void);//获得当前进程的有效用户ID
gid_t getgid(void);//获得当前进程的用户组ID
pid_t getppid(void);//获得当前进程的父进程ID
pid_t getpgrp(void);//获得当前进程所在的进程组ID
pid_t getpgid(pid_t pid);//获得进程ID 为 pid 的进程所在的进程组 ID
- 实际用户:即登陆的用户ID,自己的账号登陆系统后,输入 id ,即可查看到自己的用户ID,当前登陆进去的用户即为实际用户。可以用当前用户启动很多进程。
- 有效用户:在登陆实际用户后,我们仍然可以用不同的用户来启动进程,比如 root 用户。这种就使在执行进程的时候以一种特定的身份去启动,这个身份就是有效用户。一般情况下,有效用户就是实际用户。
例子:process_id.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> int main(void)
{
printf("pid: %d\n", getpid());//获得当前启动进程的进程编号
printf("uid: %d\n", getuid());//获得当前实际用户的ID
printf("ppid: %d\n", getppid());//获得当前执行进程的父进程号
printf("euid: %d\n", geteuid());//获得当前有效用户的 ID
printf("user gid: %d\n", getgid());//获得用户的组ID
printf("gid: %d\n", getpgrp());//获得当前进程组的ID
printf("pgid: %d\n", getpgid(getpid()));//获得指定进程的进程组ID
printf("ppgid: %d\n", getpgid(getppid()));//获得当前父进程所在的进程组的ID return ;
}


当前 ppid 即父进程ID为8468,为当前 shell 的进程
uid 为用户组 ID,我们当前用户的id 为1000,用户组的 ID 为 1000

实际用户和有效用户区别:
查看当前要运行的进程的所在组,可以看见文件的实际用户和实际用户组都为 rk3399

进入 root 模式修改文件的所属组:sudo chown root.root bin/process_id

修改粘着位,通过修改粘着位可以修改启动进程的有效用户:
sudo chmod u+s bin/process_id //增加粘着位
s 就是粘着位的设置,为文件添加有效用户

可以看见增加了一个 s,执行权限变为了 s
运行程序:

可以看见实际用户还是我们当前的用户,有效用户 euid 变为了 root
当针对文件拥有者本身修改粘着位以后,在运行进程的时候,可以将原先用户的权限(rk3399)提升位文件拥有者(root)的权限。
二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识的更多相关文章
- 二十六、Linux 进程与信号---system 函数 和进程状态切换
26.1 system 函数 26.1.1 函数说明 system(执行shell 命令)相关函数 fork,execve,waitpid,popen #include <stdlib.h> ...
- Linux学习之CentOS(二十一)--Linux系统启动详解
在这篇随笔里面将对Linux系统的启动进行一个详细的解释!我的实验机器是CentOS6.4,当然对于现有的Linux发行版本,其系统的启动基本上都是一样的! 首先我们来看下Linux系统启动的几个 ...
- Linux 命令 - kill: 向进程发送信号
kill 命令通常用来 “杀死”(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序.kill 命令准确地说并不是 “杀死” 进程,而是给进程发送信号(signal). 和文件一样,进 ...
- linux 下信号处理命令trap && linux下各种信号的意义
1.用途说明 trap是一个shell内建命令,它用来在脚本中指定信号如何处理.比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出 ...
- 二十三、Linux 进程与信号---进程链和进程扇、守护进程和孤儿进程以及僵尸进程
23.1 进程链和进程扇 23.1.1 概念 进程链:一个父进程构建出一个子进程,子进程再构建出子子进程,子子进程构建出子子子进程.... 这种就为进程链 进程扇:一个父进程构建出多个子进程,子进程都 ...
- 二十二、Linux 进程与信号---进程创建
22.1 fork 和 vfork 函数 22.1.1 函数说明 #include <unistd.h> #include <sys/types.h> pid_t fork( ...
- Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)
1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...
- 二十八、Linux 进程与信号---前台进程组
28.1 介绍 28.1.1 概念 自动接受终端信号的组称为前台进程组 在终端通过 ctrl + c 等动作产生的信号首先被前台进程组接受 在 shell 启动的若干个进程组默认是父进程所在的组为前台 ...
- 三十一、Linux 进程与信号——SIGCHLD 信号、kill和raise函数以及alarm函数
31.1 SIGCHLD 信号 子进程状态发生变化(子进程结束)产生该信号,父进程需要使用 wait 调用来等待子进程结束并回收它. 避免僵尸进程 #include <stdio.h> # ...
随机推荐
- base64加密图片处理
场景:下载html中内嵌的base64加密图片 举个例子,博客园的插入图片有两种方式,一是引用图片链接,二是直接粘贴2进制图片文件.以第二种方式的图片则是以base64加密的方式内嵌在html页面中. ...
- 简明的Python教程中的几个疑惑点分析#2
#1简明的Python教程当中第十四章Python标准库介绍中的使用sys模块 假如你没看懂sys模块这一章节,那么没关系,看下面一段代码再看简明的Python教程中的sys模块实例你将很容易看懂 代 ...
- webpack入门(四)webpack的api 2 module
接着介绍webpack的module. module Options affecting the normal modules (NormalModuleFactory) 这些选项影响普通的模块 m ...
- 纪中2018暑假培训day3提高a组改题记录(混有部分b组)
day3 模拟赛,看了看a组题,发现是博弈论,非常开心(因为好玩),于是做的a组.结果差点爆零,死命纠结t1的sg函数,但其实只是一个dp,不用扯到sg函数的那种. t1: Description 被 ...
- AtCoder arc061C Snuke's Subway Trip
大意: 给你一张无向图,边有种类. 当你第一次/重新进入某种边时费用 + 1 在同一种边之间行走无费用. 求 1 到 n 的最小费用. 嗯...乍一看有一个很直观的想法:记录每个点的最短路的上一条边的 ...
- 关于MySQL索引的最左前缀匹配原则原理说明说明
假设有2个这样的SQL SELECT * FROM table WHERE a = 1 AND c = 3; // c不走索引 SELECT * FROM table WHERE a = 1 AND ...
- linux 系统调用之文件操作
fcntl 文件控制 open 打开文件 creat 创建新文件 close 关闭文件描述字 read 读文件 write 写文件 readv 从文件读入数据到缓冲数组中 writev 将缓冲数组里的 ...
- Spring3 (事务管理)
简介: 1.事务管理.2.整合Junit.3.整和Web 1 事务管理 1.1 回顾事务 l 事务:一组业务操作ABCD,要么全部成功,要么全部不成功. l 特性:ACID 原子性 ...
- Ubuntu: Windows Help Tools For Ubuntu
Virtual Box https://www.virtualbox.org/wiki/Linux_Downloads 装不上Wine时直接装虚拟机吧.RTX真是个坑爹的东西,找不到替代的客户端 迅雷 ...
- Excel:11个查询函数组合
还不懂?上栗子~ 1.普通查找 根据表二中的姓名,查找表一对应的应发工资.最基础的VLOOKUP函数就能搞定. 2.反向查找 根据表二姓名,查找表一编号.但表一中编号列在姓名列之前,无法直接使用VLO ...