Linux —— 信号初识
发布日期:2025-04-06 07:46:32 浏览次数:7 分类:精选文章

本文共 1732 字,大约阅读时间需要 5 分钟。

Linux信号——初识

Linux操作系统中的信号是内核与进程之间进行异步通信的一种机制。它允许系统或进程向其他进程发送简短的控制信息,以通知事件发生或要求进程采取某种行动。信号是软中断,由软件生成,而非硬件触发。

信号的来源

信号可以来自多个来源:

  • 内核:内核会因各种事件自动发送信号给进程,比如进程执行非法指令、访问无效内存地址、用户按下Ctrl+C终止进程等。
  • 进程:进程可以通过系统调用kill()向自己或其他进程发送信号。
  • 终端:用户在终端上操作时,比如按下Ctrl+C或Ctrl+Z,内核会向前台进程发送信号。
  • 硬件:虽然信号主要由软件生成,但某些硬件异常也可能间接触发信号。
  • 信号的目的

    信号主要有以下几种用途:

  • 通知事件:告知进程某些状态变化或事件的发生,例如子进程结束、定时器到期等。
  • 控制进程行为:可以请求进程采取特定动作,比如终止、暂停、继续执行或调整优先级。
  • 信号的处理方式

    每个信号都有其默认行为,用户可以选择忽略或自定义处理方式:

  • 默认动作:比如SIGINT通常会导致进程终止。
  • 忽略:进程可以选择不处理某些信号。
  • 自定义处理:通过signal()或sigaction()系统调用指定信号的处理方式。
  • 信号掩码与阻塞

    进程可以设置信号掩码,选择性地阻塞某些信号的传递,以控制进程的行为。

    常见信号

    以下是几个常用的信号类型及其用途:

    • SIGHUP (1):挂起信号,通常在终端线路挂断时发送。
    • SIGINT (2):中断信号,用户按下Ctrl+C时发送。
    • SIGQUIT (3):退出信号,通常伴随核心转储。
    • SIGKILL (9):强制终止信号,无法被忽略或阻塞。
    • SIGTERM (15):终止信号,用于请求进程正常终止。
    • SIGSEGV (11):段错误信号,指示内存访问错误。
    • SIGALRM (14):闹钟信号,与定时器相关。
    • SIGCHLD (17):子进程状态改变信号,用于监控子进程。
    • SIGSTOP (19):停止信号,立即停止进程。
    • SIGCONT (18):继续执行信号,恢复被停止的进程。
    • SIGUSR1/SIGUSR2 (10, 31):用户自定义信号,供应用程序使用。

    通过kill -l命令可以查看所有支持的信号类型。

    测试信号

    编写一个简单的C程序,例如:

    #include 
    #include
    using namespace std;int main(){ while(true){ cout << "running process..." << endl; sleep(1); }}

    编译并运行,按下Ctrl+C或其他信号键组合来观察程序的反应。

    signal函数

    为了验证Ctrl+C和信号2是否为同一事件,可以编写一个信号处理函数。例如:

    #include 
    #include
    #include
    using namespace std;void signal_handler(int signum){ cout << "Caught SIGINT, ignoring..." << endl; exit(0);}int main(){ signal(SIGINT, signal_handler); while(true){ cout << "running process..." << endl; sleep(1); }}

    编译并运行,按下Ctrl+C验证。

    后台程序管理

    使用ampersand(&)将程序后台运行:

    ./your_program &

    前台程序可以通过fg命令转为后台,将终点步回前台。

    中断向量表

    中断向量表是计算机系统中关键的数据结构,存储各中断服务程序的入口地址。它决定了如何高效响应外部事件,如键盘输入、定时器到期等。

    在实际工作中,理解信号机制是编写稳定、高效系统程序的核心技能。掌握信号、进程间通信和系统调用的使用,可以让程序更健壮、更具韧性。

    上一篇:Linux —— 信号量
    下一篇:linux zip压缩排除目录,linux tar压缩排除某个文件夹的方法

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月20日 19时00分45秒