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: 启动该进程的命令的名称
目录
相关文章
|
12月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
11月前
|
安全 Linux
【Linux】阻塞信号|信号原理
本教程从信号的基本概念入手,逐步讲解了阻塞信号的实现方法及其应用场景。通过对这些技术的掌握,您可以更好地控制进程在处理信号时的行为,确保应用程序在复杂的多任务环境中正常运行。
377 84
|
9月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
179 20
|
8月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
162 0
|
8月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
219 0
|
11月前
|
存储 Linux 调度
【Linux】进程概念和进程状态
本文详细介绍了Linux系统中进程的核心概念与管理机制。从进程的定义出发,阐述了其作为操作系统资源管理的基本单位的重要性,并深入解析了task_struct结构体的内容及其在进程管理中的作用。同时,文章讲解了进程的基本操作(如获取PID、查看进程信息等)、父进程与子进程的关系(重点分析fork函数)、以及进程的三种主要状态(运行、阻塞、挂起)。此外,还探讨了Linux特有的进程状态表示和孤儿进程的处理方式。通过学习这些内容,读者可以更好地理解Linux进程的运行原理并优化系统性能。
430 4
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
244 26
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
272 17
|
11月前
|
存储 算法 数据处理
进程基础:概念、状态与生命周期
进程是操作系统进行资源分配和调度的基本单位,由程序段、数据段和进程控制块(PCB)组成。线程是进程中更小的执行单元,能独立运行且共享进程资源,具有轻量级和并发性特点。进程状态包括就绪、运行和阻塞,其生命周期分为创建、就绪、运行、阻塞和终止阶段。
730 2
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
617 13