• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-08-14 23:09 Aet 隐藏边栏 |   抢沙发  7 
文章评分 2 次,平均分 5.0

信号

概述

  1. /usr/include/
  2. 信号是进程间通信(IPC)的一种简单机制
  3. 信号提供了一种向进程传递通知和信息的方式,以便进程可以相应地做出反应

信号类型

  1. SIGINT:当用户按下CTRL-C时,通常发送这个信号来中断进程
  2. SIGTERM:用于正常终止进程,是kill命令的默认信号
  3. SIGKILL:用于立即终止进程,不允许进程执行任何清理操作
  4. SIGSTOP:用于暂停进程的执行
  5. SIGCONT:用于继续被停止的进程
  6. SIGSEGV:当进程访问无效内存时生

发送信号

  1. 可以使用kill命令或kill系统调用来向进程发送信号

kill

  1. 示例

  1. 系统上可用的所有信号
    1. 可以用kill发送的信号(系统为debian

处理信号

  1. 进程可以选择忽略某些信号、执行默认操作或指定特定的处理程序
  2. 通过使用signalsigaction系统调用,进程可以注册特定的处理程序

默认行为

  1. 每个信号都有一个与之关联的默认行为,这可以是忽略信号、终止进程、终止并转储核心文件或停止/继续进程

异步信号

  1. 由其他进程或系统触发

同步信号

  1. 由进程自身的操作触发,如除以零导致的SIGFPE

信号阻塞和未决

  1. 进程可以阻塞某些信号,使它们暂时不被处理
    1. 这些信号将变为未决,直到进程解除阻塞

定义

  1. debian

signal

概述

  1. 这个函数是UnixLinux系统中用来处理信号的一种机制
    1. signal函数允许你定义某个信号发生时应该采取的动作

原型

参数

  1. 需要处理的信号编号
  2. 信号处理函数
    1. SIG_DFL: 使用该信号的默认处理动作
    2. SIG_IGN: 忽略该信号

返回值

  1. 成功时,signal返回先前的信号处理函数的地址
  2. 失败时,返回SIG_ERR

代码示例

sigaction

概述

  1. 函数在Unix和Linux系统中用于控制信号的处理行为
  2. 它可以更精确地定义一个信号的处理方式,提供了比signal函数更多的控制

原型

参数

  1. 信号编号,指定要处理的信号
  2. 指向一个sigaction结构体的指针,定义信号处理的新行为
    1. 如果此参数为NULL,则不改变信号的行为,但仍可以用来查询旧的信号行为
  3. 指向一个sigaction结构体的指针,用于保存信号处理的旧行为
    1. 如果此参数为NULL,则不返回旧的行为

返回值

  1. 成功时返回0,失败时返回-1,并设置errno以指示错误原因

代码示例

信号集

概述

  1. 信号集在UnixLinux系统中是用于表示信号的集合的数据结构
  2. 这些集合通常用于定义哪些信号应该被阻塞(即暂时忽略)或等待处理
    1. 信号集对于管理复杂的信号处理逻辑非常有用
    2. 被设置为1的信号,都是属于当前被阻塞的不能传递的这个进程的信号
  3. 信号集可以包括一个或多个信号,或者根据需要不包括任何信号
    1. 你可以使用一组函数来操作这些集合,例如添加信号、删除信号、检查信号是否存在等

主要函数

  1. 初始化信号集,使其不包括任何信号

  1. 初始化信号集,使其包括所有可捕获的信号

  1. 将指定的信号添加到信号集中

  1. 从信号集中删除指定的信号

  1. 检查指定的信号是否在信号集中。如果在集合中,返回1,如果不在,返回0

示例代码

进程状态

运行态

  1. R
  2. 进程正在运行或在运行队列中等待运行

中断睡眠态

  1. S
  2. 这是可中断的睡眠状态,进程等待某个条件的满足或某些资源的可用性
    1. 如果满足条件,进程将被唤醒并转入运行状态

不可中断睡眠态

  1. D
  2. 这是一种不可中断的睡眠状态。进程正在等待I/O操作完成,或等待某些特殊资源
    1. 在此状态下,进程不响应任何信号和中断

僵尸状态

  1. Z
  2. 进程已终止,但父进程还没有读取其退出状态
  3. 进程的大部分资源都已释放,但进程描述符仍存在,以便父进程读取子进程的退出状态

停止状态

  1. T
  2. 进程已停止执行
    1. 这可能是因为它收到了SIGSTOPSIGTSTPSIGTTINSIGTTOU信号,或者它正在被调试

追踪停止状态

  1. t
  2. 进程由于调试而被停止

死亡状态

  1. X
  2. 进程正在退出,但还未成为僵尸进程

唤醒杀死状态

  1. K
  2. 进程被唤醒,以便被kill

空闲状态

  1. I
  2. 适用于内核线程,线程没有运行并处于空闲状态

状态字符<

  1. <
  2. 表示进程具有高优先级(或称为负的nice值)
  3. Linux中,nice值范围从-20(最高优先级)到19(最低优先级)
    1. 此标志表明进程具有比默认优先级更高的优先级

状态字符+

  1. +
  2. 表示进程处于前台进程组
    1. 在终端交互中,前台进程组与用户交互,而后台进程组则独立于用户进行操作

操作系统执行模式

用户态

  1. user mode
  2. 在用户态运行的程序受到许多权限限制,不能直接访问硬件或执行某些特权指令
  3. 用户态程序只能访问分配给它们的内存空间,不能访问其他进程的内存或内核空间
  4. 要执行特权操作(如读写文件、管理进程等),用户态程序必须通过系统调用请求内核提供这些服务
  5. 用户态程序的错误通常不会影响整个系统,因为它们的权限受限
  6. 注意:
    1. 不要在用户态程序中尝试执行需要特权的操作,而是使用正确的系统调用
    2. 确保代码不会尝试访问超出其分配范围的内存,以防止段错误等问题

内核态

  1. kernel mode
  2. 在内核态中,代码可以执行任何CPU指令并直接访问所有硬件
  3. 内核态代码可以访问整个物理内存,包括所有用户空间和内核空间
  4. 内核态负责处理从用户态发起的系统调用
  5. 硬件驱动和核心系统服务通常在内核态中运行
  6. 注意:
    1. 内核代码的错误可能导致整个系统崩溃或不稳定,因此需要格外小心
    2. 由于内核态代码有权访问所有资源,因此需要确保对资源的访问经过适当的同步和保护,以防止竞争条件等问题
    3. 不要不必要地将代码放在内核态执行。如果可以在用户态完成,那么应该在用户态中完成

可重入函数

  1. 可重入函数是在多线程环境下可以被多个线程安全地并发调用的函数
  2. 特点:
    1. 不使用全局或静态数据
    2. 不修改自身的代码
    3. 不调用不可重入的函数

不可重入函数

  1. 不可重入函数可能使用全局或静态数据,或者可能调用其他不可重入的函数
  2. 在多线程环境中同时调用不可重入函数可能会导致数据竞争和不确定的行为

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享