首页 > 系统相关 >Linux信号

Linux信号

时间:2023-08-05 18:22:44浏览次数:43  
标签:SIGRTMAX int signal 信号 Linux include SIGRTMIN

https://www.51cto.com/article/675743.html

异步和同步的区别

同步可以理解成串行执行,每个任务执行有先后顺序;

异步则是并行执行,你做你的事,我干我的事情,相互独立

信号是异步的,一个进程不必通过任何操作来等待信号的到达。事实上,进程也不知道信号到底什么时候到达。一般来说,我们只需要在进程中设置信号相应的处理函数,当有信号到达的时候,由系统异步触发相应的处理函数即可。

产生信号

硬件产生信号:通过终端按键产生信号

ctrl -c是 SIGINT 信号

ctrl -z 是SIGSTOP信号

ctrl -\ 是SIGQUIT信号

输入命令经过系统调用产生信号:kill命令产生信号,调用的是kill()函数 ;

kill函数可以给一个指定的进程发送指定的信号。

raise函数可以给当前进程发送指定的信号(自己给自己发信号)

由软件条件产生信号:调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号,该信号的默认处理动作是终止当前进程。

#include <unistd.h>
#include <stdio.h>
int main(void)
{
 int counter;
 alarm(1);
 for(counter=0; 1; counter++)
 printf("counter=%d ", counter);
 return 0;
}

处理信号

signal()函数对信号进行处理

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

例子1:通过SIG_IGN来忽略SIGINT信号

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

int main()
{
  int i = 0;

  signal(SIGINT, SIG_IGN);  //通过SIG_IGN来忽略SIGINT信号

  do
  {
    write(1,"*", 1);
    sleep(1);
    i++;
  }while(i < 10);
  
  exit(0);
}

例子2:通过自定义的func函数处理信号

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

static void func(int signo)
{
    write(1,"\n ...coming a signal named SIGINT ,func is called\r\n", 50);  
}

int main()
{
  int i = 0;

  signal(SIGINT,func);  

  do
  {
    write(1,"*", 1);
    sleep(1);
    i++;
  }while(i<10);
  
  exit(0);
}

[xuanmiao@192 ~]$ 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  

来一段烧脑的代码

#include <stdio.h>

enum { RED, GREEN, BLUE };

void OutputSignal(int sig)
{
        printf("The signal you /'ve input is: ");
        switch(sig)
        {
            case RED:
                   puts("RED!");
                   break;
          case GREEN:
                   puts("GREEN!");
                   break;
          case BLUE:
                   puts("BLUE!");
                   break;
       }
       
       return;
}

void ( *signal( int sig, void (*func)(int) ) ) (int)
{
          puts("Hello, world!");
          func(sig);
          return func;
}

int main(void)
{
           ( *signal (GREEN, &OutputSignal) )  (RED);
           return 0;
}

程序的执行结果:

[xuanmiao@192 Demo]$ ./test 
Hello, world!
The signal you /'ve input is: GREEN!
The signal you /'ve input is: RED!

标签:SIGRTMAX,int,signal,信号,Linux,include,SIGRTMIN
From: https://www.cnblogs.com/xuanmiao363/p/17608370.html

相关文章

  • Linux 创建子进程
    @TOC前言在计算机科学中,进程(Process)、线程(Thread)和程序(Program)是三个关键概念,它们在操作系统和并发编程中扮演重要角色。一、进程,线程,程序区分程序(Program):是一系列按照特定顺序编写的指令集合,用于实现特定任务。程序是静态的,通常以文本文件的形式存储在磁盘上。例如,计算器应用程......
  • Linux 常用的磁盘命令
    【Linux】与磁盘相关的常用命令(自用)感谢地心引力已于2023-07-0115:33:50修改4415收藏分类专栏:UbuntuLinux文章标签:linux运维服务器版权UbuntuLinux专栏收录该内容38篇文章0订阅订阅专栏本文将详细介绍以下几个常用的命令:df、du、fdisk、mkfs、lsblk、mount、umou......
  • linux select函数详解
    转载:linuxselect函数详解-AlanTu-博客园(cnblogs.com)在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核:     •我们所关心的文件描述符     •对每个描述符,我们所关心的状态。(我们是要想从一个文件描述符中读或者写,还......
  • Linux系统下将java程序开机自启
    Linux系统下将java程序开机自启在Linux环境下,可以通过将Java程序配置为系统服务(systemd服务)来实现开机自启动。使用systemd可以很方便地管理和控制后台服务,包括Java程序。以下是一个简单的步骤来配置Java程序为systemd服务:1.编写启动脚本创建一个脚本文件,用于启动您的Java程序......
  • linux---设置允许流量转发
    linux---设置允许流量转发临时生效:#方法1(必须使用root账户)echo1>/proc/sys/net/ipv4/ip_forward#方法1变种(有sudo权限即可)echo1|sudotee/proc/sys/net/ipv4/ip_forward#方法2sudosysctl-wnet.ipv4.ip_forward=1方法1和方法2效果一样永久生效:修改/et......
  • linux磁盘管理
    1、fdisk-l      查看所有磁盘信息n      创建新分区d       删除分区p       列出分区表w       保存分区表并退出e        扩展分区2、partprobe    刷新分区表3、df-T     ......
  • 随笔(二十六)『SpringBoot + Vue 简单部署到Linux』
    1、安装docker1.1、卸载系统之前的dockersudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\......
  • 岩土工程仪器多通道振弦传感器信号转换器应用于隧道安全监测
    岩土工程仪器多通道振弦传感器信号转换器应用于隧道安全监测多通道振弦传感器信号转换器VTI104_DIN是轨道安装式振弦传感器信号转换器,可将振弦、温度传感器信号转换为RS485数字信号和模拟信号输出,方便的接入已有监测系统。传感器状态专用指示灯方便现场安装调试。VTI104_DIN......
  • linux怎么查看文件夹多大
    方法:1、利用ls命令查看,该命令可将结果以KB、MB等为单位进行显示,语法为“ls-ll”或“ls-lh”;2、利用“du-h–max-depth=1*”命令,该命令可查看当前目录下的各个文件和文件夹的大小;3、利用“du-sh”命令,可查看当前文件夹的总大小;4、利用“du-h–max-depth=0*”命令,可查看直接......
  • Linux git mirror站点
    由于kernel的官网站点和Github镜像下载都很慢,于是想到找一下国内镜像站点。kernel.org有个GitmirroravailableinBeijing,地址为https://kernel.source.codeaurora.cn/,但是已经失效,具体说明看这里。kernel.org上还有个知道如何建立kerelmirror的指导页面,但是没有提供......