Linux系统编程-进程概念、进程管理、信号处理

简介: 操作系统里的进程是程序一次执行的过程,是操作系统动态执行的基本单元;每当创建新的进程后,操作系统会为新的进程分配一个唯一的标识符,方便后续管理进程。

1. 进程知识点

操作系统里的进程是程序一次执行的过程,是操作系统动态执行的基本单元;每当创建新的进程后,操作系统会为新的进程分配一个唯一的标识符,方便后续管理进程。

进程的概念主要有两点:

第一,进程是一个实体。每个进程都有自己的虚拟地址空间,包括文本区、数据区、和堆栈区。文本区域存储处理器执行的代码;数据区存储变量和动态分配的内存;堆栈区存储着活动进程调用的指令和本地变量。

第二,进程是一个“执行中的程序”,它和程序有本质区别。程序是静态的,它是一些保存在磁盘上的指令的有序集合;而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建、调度和消亡的过程,是Linux的基本调度单位。只有当处理器赋予程序生命时,它才能成为一个活动的实体,称之为进程。

Linux在命令行上可以用ps命令查看后台运行的进程详细信息。

2. 查看可执行文件的内部空间布局

进程是动态的(内存里的)、程序是静态的_a.out(硬盘上)。
Linux下进程都是运行在虚拟地址空间的---MMU。每个进程的空间是独立的(物理地址)。

[wbyq@wbyq linux_c]$ gcc app.c 
[wbyq@wbyq linux_c]$ ls
a.out  app.c  shell.sh
[wbyq@wbyq linux_c]$ ./a.out 
[wbyq@wbyq linux_c]$ size a.out 
   text    data     bss     dec     hex filename
    960     248       8    1216     4c0 a.out
text :文本段. 程序里存放逻辑代码的大小. if while ....
data :数据段. 程序里已经初始化过的全局变量和静态变量的大小.
bss  :BSS段.  程序里未初始化的全局变量和静态变量的大小.
dec  :十进制格式的程序总大小
hex  :十六进制格式的程序总大小
filename :文件的名称

3. 进程前台与后台切换方式

[wbyq@wbyq linux_c]$ ./a.out &     后台运行
[1] 14705  
[wbyq@wbyq linux_c]$ jobs     查看后台运行的进程
[1]+  Running                 ./a.out &
[wbyq@wbyq linux_c]$ fg 1      将后台进程切换到前台
./a.out
^Z
[1]+  Stopped                 ./a.out
[wbyq@wbyq linux_c]$ jobs    
[1]+  Stopped                 ./a.out
[wbyq@wbyq linux_c]$ bg 1     将后台停止的进程变为执行状态
[1]+ ./a.out &
[wbyq@wbyq linux_c]$ jobs   
[1]+  Running                 ./a.out &
[wbyq@wbyq linux_c]$ fg 1
./a.out

4. kill命令

4.1 查看合法信号

Kill命令是给进程发送信号. 当前系统可以发送的合法信号有哪些? 通过kill -l

[wbyq@wbyq linux_c]$ kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    

4.2 如何发送信号?

kill [-s signal|-p] [--] pid...
kill -l [signal]

用法:
kill -s <信号> <进程PID>
kill -信号 <进程PID>

[wbyq@wbyq linux_c]$ ps
  PID TTY          TIME CMD
 9877 pts/0    00:00:01 bash
14983 pts/0    00:00:01 a.out
14984 pts/0    00:00:00 ps
[wbyq@wbyq linux_c]$ kill -s 2 14983

4.3 C语言程序如何捕获信号?

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void sighandler(int sig)
{
    printf("sig=%d\n",sig);
    exit(0);
}

int main()
{
    signal(SIGINT,sighandler);  
    while(1)
    {

    }
    return 0;
}

5. ps命令

[wbyq@wbyq linux_c]$ ps -aux
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2880 1432 ? Ss Aug16 0:06 /sbin/init
root 2 0.0 0.0 0 0 ? S Aug16 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Aug16 0:03 [migration/0]
root 4 0.0 0.0 0 0 ? S Aug16 0:18 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S Aug16 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S Aug16 0:07 [watchdog/0]
root 7 0.0 0.0 0 0 ? S Aug16 0:05 [migration/1]
root 8 0.0 0.0 0 0 ? S Aug16 0:00 [migration/1]
root 9 0.0 0.0 0 0 ? S Aug16 0:20 [ksoftirqd/1]
root 10 0.0 0.0 0 0 ? S Aug16 0:14 [watchdog/1]
root 11 0.0 0.0 0 0 ? S Aug16 0:46 [events/0]
root 12 0.0 0.0 0 0 ? S Aug16 1:18 [events/1]
USER: 启动该进程的用户账号名称
PID: 该进程的 ID 号,在当前系统中是唯一的
%CPU: CPU 占用的百分比
%MEM: 内存占用的百分比
VSZ: 占用虚拟内存(swap 空间)的大小
RSS: 占用常驻内存(物理内存)的大小
TTY: 该进程在哪个终端上运行。 “? ”表未知或不需要终端
STAT: 显示了进程当前的状态。
D 不可中断的休眠。通常是 IO。
R 运行。正在运行或者在运行队列中等待。
S 休眠。在等待某个事件,信号。
T 停止。进程接收到信息 SIGSTOP, SIGSTP, SIGTIN, SIGTOU 信号。
X 死掉的进程,不应该出现。
Z 僵死进程。
通常还会跟随如下字母表示更详细的状态。
< 高优先级
N 低优先级
L 有 pages 在内存中 locked。用于实时或者自定义 IO。
s 进程领导者,其有子进程。
l 多线程
+ 位于前台进程组。
START: 启动该进程的时间.
TIME: 进程使用的总 CPU 时间
COMMAND: 启动该进程的命令的名称
目录
相关文章
|
13天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
44 4
linux进程管理万字详解!!!
|
4天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
41 8
|
13天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
46 4
|
14天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
6月前
|
Linux Shell 调度
【Linux】7. 进程概念
【Linux】7. 进程概念
67 3
|
6月前
|
存储 缓存 Linux
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
|
3月前
|
Linux Shell 调度
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【在Linux世界中追寻伟大的One Piece】Linux进程概念
40 1
|
5月前
|
存储 Linux Shell
Linux进程概念(上)
冯·诺依曼体系结构概述,包括存储程序概念,程序控制及五大组件(运算器、控制器、存储器、输入设备、输出设备)。程序和数据混合存储,通过内存执行指令。现代计算机以此为基础,但面临速度瓶颈问题,如缓存层次结构解决内存访问速度问题。操作系统作为核心管理软件,负责资源分配,包括进程、内存、文件和驱动管理。进程是程序执行实例,拥有进程控制块(PCB),如Linux中的task_struct。创建和管理进程涉及系统调用,如fork()用于创建新进程。
64 3
Linux进程概念(上)
|
5月前
|
存储 Shell Linux
Linux进程概念(下)
本文详细的介绍了环境变量和进程空间的概念及其相关的知识。
37 0
Linux进程概念(下)
|
5月前
|
Linux Shell 调度
Linux进程概念(中)
本文详细解析了Linux进程的不同状态,包括运行、阻塞、挂起,以及僵尸和孤儿进程的概念。讨论了进程优先级的重要性,以及操作系统如何通过活动队列、过期队列和优先级管理进程调度。
49 0