Linux 信号,僵尸进程,(面试)

本文详细介绍了Linux中的信号机制,包括信号种类、处理方式和信号发送。特别讨论了不能被忽略的SIGKILL和SIGSTOP信号。接着阐述了僵尸进程的概念,指出在进程退出后,操作系统保留部分信息,如进程ID、终止状态和资源利用信息,供父进程后续获取。文章还探讨了如何避免产生僵尸进程,如使用wait或waitpid函数、设置信号处理函数和采用两次fork方法。最后,分析了wait和waitpid的区别以及在处理多个子进程退出时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,信号有那些是不能被屏蔽的???(SIGKILL和SIGSTOP

2,僵尸进程是什嘛样子的,产生子进程的时候给其分配空间了之后,在变成僵尸进程之后,对这块空间是如何处理

  的,是将其全部释放掉???还是保留部分空间给(子进程的进程ID、终止状态以及资源利用信息(CPU时间,内

  存使用量),因为父进程可能会用到这些东西,????


信号(signal)是Linux进程间通信的一种机制,全称为软中断信号,也被称为软中断。信号本质上是在软件层次上对硬件中断机制的一种模拟。信号提供了一种处理异步事件的方法。每个信号的名字都以SIG字符开头,为正整型常量,定义在<signal.h>头文件中(实际上,实现将信号定义在内核头文件中,<signal.h>又包含该内核头文件,如:Linux 3.2.0将信号定义在<bits/signum.h>中,FreeBSD 8.0将信号定义在<sys/signal.h>中)


信号有3种处理方式:

(1) 忽略此信号。大多数信号都使用这种方式处理。但是有两种信号不能被忽略:SIGKILL和SIGSTOP。原因是这两种信号向内核和超级用户提供了使进程终止或停止的可靠方法。另外,如果忽略某些由硬件异常产生的信号(如非法内存引用、除0错误等),那进程的运行行为是未定义的。

(2) 捕捉信号。通知内核在某种信号发生时,调用一个用户函数来处理该信号。同样地,不能捕捉SIGKILL和SIGSTOP信号。

(3) 执行系统默认动作。对大多数信号而言,系统默认动作就是终止该信号。



与其他进程间通信方式(例如管道、共享内存等)相比,信号所能传递的信息比较粗糙,只是一个整数。但正是由于传递的信息量少,信号也便于管理和使用,可以用于系统管理相关的任务,例如通知进程终结、中止或者恢复等。

每种信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD、SIGINT等,它们在系统头文件<signal.h>中定义。

信号由内核(kernel)管理,产生方式多种多样:
  • 可以由内核自身产生,比如出现硬件错误、内存读取错误,分母为0的除法等,内核需要通知相应进程。
  • 也可以由其他进程产生并发送给内核,再由内核传递给目标进程。

信号传递的过程:
  • 内核中针对每一个进程都有一个表来保存信号。
  • 当内核需要将信号传递给某个进程时,就在该进程对应的表中写入信号,这样就生成了信号。
  • 当该进程由用户态陷入内核态,再次切换到用户态之前,会查看表中的信号。如果有信号,进程就会首先执行信号对应的操作,此时叫做执行信号。
  • 从生成信号到将信号传递给对应进程这段时间,信号处于等待状态。
  • 我们可以编写代码,让进程阻塞(block)某些信号,也就是让这些信号始终处于等待的状态,直到进程取消阻塞(unblock)或者忽略信号。







可再入函数

进程捕捉到信号并对其进行处理时,正常执行的指令序列就会被中断,首先需要执行信号处理程序,之后则应该接着执行之前未完成的指令序列。但是在信号处理程序中,并不能判断捕捉到信号时进程执行到什么地方,如果进程正在执行malloc,而此时由于捕捉到信号而插入信号处理函数也要调用malloc,此时,由于malloc通常会为它所分配的存储区维护一个链表,而插入信号处理函数时,该进程正在修改链表,那么结果是进程环境遭到破坏,丢失重要信息。

Single Unix Specification说明了在信号处理程序中保证调用安全的函数,这些函数是可再入的,称为异步信号安全(async-signal safe)函数。除了可再入外,在信号处理期间,它会阻塞任何引起不一致的信号发送。

一般不可再入函数有如下特点:

(1)   使用静态数据结构;

(2)   调用malloc或free;

(3)   属于标准I/O函数,因为很多标准I/O库都以不可再入的方式使用了全局数据结构。

 

可靠信号术语

不可靠的信号是指信号在处理之前可能丢失。在发送一个信号给进程时,我们说向进程递送(delivery)了一个信号。在信号产生(generation)和递送之间的时间间隔内,称该信号是未决(pending)的。

如果进程采用“阻塞信号递送”(每个信号都有一个信号屏蔽字(signal mask),它规定了当前要阻塞递送到该进程的信号集。进程可以调用sigprocmask来检测和更改当前信号屏蔽字。进程调用sigpending函数来判断哪些信号是设置为阻塞并处于pending状态),而且对该信号的处理是采用系统默认动作或者捕捉该信号,那么该信号将一直保持未决状态,直到进程对信号解除阻塞,或者对该信号的处理改为忽略。


信号种类

下表列出了一些常见信号:


每种信号都会有一个默认动作。默认动作就是脚本或程序接收到该信号所做出的默认操作。常见的默认动作有终止进

程、退出程序、忽略信号、重启暂停的进程等,上表中也对部分默认动作进行了说明。



发送信号

有多种方式可以向程序或脚本发送信号,例如按下<Ctrl+C>组合键会发送SIGINT信号,终止当前进程。

<think>好的,我现在需要处理用户关于Linux进程管理的面试问题总结请求。首先,用户提供了三个引用内容,我需要仔细查看这些引用,提取相关信息,并组织成结构清晰的回答。 首先看引用[1],里面提到了ps命令的各种参数,比如a、X、f、e、l、u等,还有排序进程的方法。这些是进程查看和监控的基础知识点,必须包含在回答中。另外,用户可能关心如何根据CPU或内存使用排序进程,这在面试中常见。 接下来是引用[3],关于僵尸进程的形成原因和解决方法。这部分内容需要详细解释,因为僵尸进程面试中的高频问题。需要说明僵尸进程的定义,父进程如何处理,以及如何避免或清理僵尸进程。 虽然引用[2]主要关于Linux目录结构,但可能与进程管理关联不大,不过还是要注意是否有相关内容。比如,是否有进程相关的配置文件存放在/etc目录下,或者日志在/var目录下,但用户的问题集中在进程管理,所以可能不需要深入这部分。 用户的需求是获取面试相关的知识点总结,所以需要分点整理,结构清晰。常见的面试问题可能包括进程状态、查看和管理进程的命令、前后台进程切换、僵尸进程和孤儿进程的区别、进程间通信方式等。 需要确保覆盖以下内容: 1. 进程基本概念:状态、PID、PPID等。 2. 常用命令:ps、top、htop、kill、pkill、pgrep、jobs、bg/fg。 3. 进程优先级和nice值调整。 4. 僵尸进程和孤儿进程的处理。 5. 进程间通信(IPC)方法。 6. 守护进程的概念和创建。 7. 性能监控工具如vmstat、iostat等,虽然用户没提到,但可能相关。 需要结合引用[1]中的ps参数示例,比如ps aux、ps -ef,以及排序命令ps aux --sort=%mem或%cpu。同时,引用[3]中的僵尸进程需要详细说明,包括如何检测和解决,比如通过wait调用或终止父进程。 另外,用户提供的引用中有关于ps命令的参数,可能需要解释每个参数的作用,例如a显示所有进程,u显示用户信息,f显示进程树等。这些参数在面试中常被问到,需要正确解释。 可能还需要补充一些用户引用中没有提到的内容,例如top命令的交互操作(如按P按内存排序)、信号的使用(如kill -9、SIGTERM等),以及进程的前后台切换(&、jobs、fg、bg)。 需要确保回答结构清晰,分点列出,每个部分有重点,并适当举例。例如,在解释ps命令时,给出常用组合命令;在讲解僵尸进程时,说明如何通过ps查看僵尸状态(Z状态)等。 最后,生成相关问题时要围绕进程管理的常见面试问题,比如进程状态转换、命令使用场景、问题排查方法等。</think>### Linux进程管理面试知识点总结 #### 一、基础概念 1. **进程状态** Linux进程状态包括:运行中(R)、可中断睡眠(S)、不可中断睡眠(D)、僵尸(Z)、停止(T)等[^3]。 可通过`ps aux`查看进程状态,例如僵尸进程会标记为`Z`。 2. **PID与PPID** - 每个进程有唯一**进程ID(PID)**,父进程ID为**PPID**。 - 使用`ps -ef`查看进程父子关系,`pstree`以树状图显示层级。 --- #### 二、进程管理命令 1. **查看进程** - `ps`命令常用组合: - `ps aux`:显示所有进程的详细信息(用户、CPU/内存占用等)[^1] - `ps -ef`:显示完整格式的进程列表 - `ps -eLf`:查看线程信息 - 按资源排序: ```bash ps aux --sort=-%cpu # 按CPU降序 ps aux --sort=%mem # 按内存升序 ``` 2. **动态监控** - `top`:实时查看系统资源占用,支持交互操作(按`P`/`M`排序CPU/内存) - `htop`(增强版):支持颜色高亮和鼠标操作 3. **进程终止** - `kill -9 PID`:强制终止进程(发送SIGKILL信号) - `pkill -f "进程名"`:根据名称批量终止进程 --- #### 三、进程调度与控制 1. **前台/后台切换** - `&`:后台运行程序(如`python script.py &`) - `jobs`:查看后台任务列表 - `fg %n`:将后台任务n切换到前台 - `bg %n`:恢复暂停的后台任务 2. **优先级调整** - `nice -n 值 命令`:启动时设置优先级(范围-20~19,值越小优先级越高) - `renice -n 值 -p PID`:修改运行中进程的优先级 --- #### 四、僵尸进程与孤儿进程 1. **僵尸进程(Zombie)** - **成因**:子进程退出后,父进程未调用`wait()`回收其资源[^3]。 - **检测**:`ps aux | grep 'Z'` - **解决**:终止父进程(僵尸进程会由init进程接管并清理) 2. **孤儿进程** - 父进程先于子进程退出,子进程由init进程(PID=1)接管,不会造成资源泄漏。 --- #### 五、高级话题 1. **进程间通信(IPC)** 常见方式:管道(`|`)、信号(如`kill`)、共享内存、消息队列、Socket。 2. **守护进程(Daemon)** - 特点:脱离终端长期运行(如httpd、mysqld) - 创建步骤:`fork()`子进程 → 脱离会话组`setsid()` → 修改工作目录`chdir("/")` 3. **性能分析工具** - `vmstat`:监控系统整体资源(CPU、内存、IO) - `strace`:跟踪进程系统调用 - `lsof -p PID`:查看进程打开的文件描述符 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值