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: 启动该进程的命令的名称
目录
相关文章
|
5天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
115 78
|
9天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
39 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
5天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
44 13
|
21天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
38 4
|
29天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
20 3
|
5天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
18 0
|
1月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
34 1
|
16天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
Linux
Linux下信号处理(发送、捕获)
Linux下进行应用编程时,信号的处理必不可少。信号可以用于多进程间通信,这篇文章就介绍如何发送信号,捕获信号。
483 0
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
95 8