Linux C 程序:使用信号处理函数实现自定义中断功能

本文将介绍如何在 Linux C 程序中使用 signal() 函数和 rand() 函数,实现自定义中断功能,例如当用户按下 Ctrl+Z 时显示星号图案,按下 Ctrl+\ 时生成随机数,按下 Ctrl+C 时结束程序运行。

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void signal_handler(int sig)
{
    switch(sig)
    {
        case SIGTSTP: // Ctrl+Z
            printf("\n");
            for(int i=0; i<5; i++)
            {
                for(int j=0; j<10; j++)
                {
                    printf("*");
                }
                printf("\n");
            }
            printf("\n");
            break;
        case SIGQUIT: // Ctrl+\
            printf("\n");
            for(int i=0; i<5; i++)
            {
                printf("%d ", rand()%100);
            }
            printf("\n");
            break;
        case SIGINT: // Ctrl+C
            printf("\nProgram terminated.\n");
            exit(0);
            break;
    }
}

int main()
{
    signal(SIGTSTP, signal_handler); // 注册Ctrl+Z的信号处理函数
    signal(SIGQUIT, signal_handler); // 注册Ctrl+\的信号处理函数
    signal(SIGINT, signal_handler); // 注册Ctrl+C的信号处理函数

    while(1)
    {
        printf("Press Ctrl+Z or Ctrl+\ or Ctrl+C.\n");
        sleep(1);
    }

    return 0;
}

运行结果

在终端运行程序后,按下 Ctrl+Z 可以显示如下图形:

**********
**********
**********
**********
**********

按下 Ctrl+\ 可以显示一批随机数,例如:

45 34 67 19 54 

按下 Ctrl+C 可以结束程序运行。

代码解析

  1. 信号处理函数 signal_handler()

    • 该函数接收一个 sig 参数,代表接收到的信号。
    • 函数内部使用 switch 语句判断信号类型,并执行相应的操作。
    • SIGTSTP 代表 Ctrl+Z 信号,程序会显示星号图案。
    • SIGQUIT 代表 Ctrl+\ 信号,程序会生成 5 个随机数。
    • SIGINT 代表 Ctrl+C 信号,程序会输出 "Program terminated." 信息并退出。
  2. main() 函数

    • 使用 signal() 函数将 SIGTSTP、SIGQUIT 和 SIGINT 信号分别与 signal_handler() 函数关联。
    • 进入无限循环 while(1),程序会一直等待用户输入。
    • 使用 sleep(1) 函数让程序每秒钟输出一次提示信息。

总结

本文介绍了如何使用 signal() 函数在 Linux C 程序中实现自定义中断功能,方便用户通过不同的按键组合控制程序的行为。该方法可以应用于各种场景,例如调试程序、控制程序运行状态等。

更多信息

Linux C 程序:使用信号处理函数实现自定义中断功能

原文地址: https://www.cveoy.top/t/topic/orB0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录