写点什么

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

作者:DS小龙哥
  • 2022 年 2 月 14 日
  • 本文字数:2453 字

    阅读完需:约 8 分钟

1. 进程知识点

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


进程的概念主要有两点:

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


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


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

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

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

[wbyq@wbyq linux_c]$ gcc app.c [wbyq@wbyq linux_c]$ lsa.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.outtext :文本段. 程序里存放逻辑代码的大小. 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) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+338) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+843) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-758) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-263) 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 bash14983 pts/0 00:00:01 a.out14984 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 -auxWarning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 2880 1432 ? Ss Aug16 0:06 /sbin/initroot 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: 启动该进程的命令的名称
复制代码


发布于: 刚刚阅读数: 2
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022.01.06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
Linux系统编程-进程概念、进程管理、信号处理