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: 启动该进程的命令的名称
目录
相关文章
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
19天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
94 6
|
2月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
139 3
|
2月前
|
Shell Linux Python
python执行linux系统命令的几种方法(python3经典编程案例)
文章介绍了多种使用Python执行Linux系统命令的方法,包括使用os模块的不同函数以及subprocess模块来调用shell命令并处理其输出。
35 0
|
3月前
|
项目管理 敏捷开发 开发框架
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
53 1
|
3月前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
3月前
|
网络协议 Linux Shell
探索Linux操作系统:从基础到高级编程
【8月更文挑战第31天】本文旨在为读者提供一条清晰的路径,从Linux操作系统的基础知识出发,逐步深入到高级编程技巧。我们将一起揭开Linux神秘的面纱,了解其内部工作原理,并通过实际代码示例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你带来新的视角和技能提升。
|
3月前
|
Linux
探索Linux操作系统:命令行与脚本编程基础
【8月更文挑战第31天】在这篇文章中,我们将一起踏上一段旅程,深入探索Linux操作系统的奥秘。通过学习命令行的使用和编写简单的脚本,你将能够更高效地与你的计算机进行交流。无论你是新手还是有经验的用户,本文都将为你打开一扇通往Linux世界的大门。准备好了吗?让我们开始吧!