Linux系统编程_10_信号

信号处理机制在linux编程中非常重要,它类似于单片机中的中断系统;我们在编写中断函数时,需要设置中断函数的地址,设置其相应的寄存器,以便于发生中断事件时可以正确的跳到中断函数去执行;

linux中信号和这个类似,一般的编程模型是定义中断函数,然后把中断函数注册,使得进程收到特定的信号时,可以跳到信号处理函数去执行;

1.kill函数与raise函数

kill函数用来将信号发送给进程或进程组;

——int kill(pid_t pid,  int signo);

raise函数则允许进程向自身发送信号;

——int raise(int signo);

调用raise(signo);等价于kill(getpid(), signo);

注意:kill函数的第一个参数:

下面是一个使用kill函数的例子:

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

pid_t pid;

void fun(int a)
{
    if(a == SIGABRT)
        printf("Have fun!\n");
    if(a == SIGUSR1)
    {
        printf("Fuck!\n");
    }
}

void send()
{
    kill(pid, SIGUSR1);// Only send msg to progress or progress group!
}

int main()
{
    int cnt = 0;
    signal(SIGABRT, fun);
    signal(SIGUSR1, fun);

    pid = fork();
    if(pid == 0)
    {
        while(1)
        {
            printf("Child!\n");
            sleep(1);
        }
    }

    while(1)
    {
        printf("Father!\n");
        cnt++;
        if(cnt == 5)
            send();
        sleep(1);
    }
}

2. alarm函数和pause函数

alarm函数用来设定计时器,设定的某个时间超时时,会产生一个SIGALRM信号,如果不捕捉改信号,默认会终止调用该alarm函数的进程。

—— unsigned int alarm(unsigned int seconds);

pause函数使得调用进程挂起直到捕捉到一个信号

—— int pause(void);

实例:

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

void fun(int id)
{
    if(id == SIGUSR1)
    {
        printf("SIGUSR1\n");
    }
    if(id == SIGALRM)
    {
        printf("SIGALRM!\n");
    }
}

int main()
{
    signal(SIGUSR1, fun);
    signal(SIGALRM, fun);
    alarm(5);   // if not catch, progress return;

    for(;;)
        pause();
    return 0;
}

3.信号集

一个可以包含多个信号的信号集,这个数据类型是sigset_t,同时,也有相应的信号集函数;

还有下列一些函数:

时间: 2024-10-14 04:20:21

Linux系统编程_10_信号的相关文章

linux系统编程之信号(四)

今天继续探讨信号相关的东东,话不多说,正入正题: 信号在内核中的表示: 下面用图来进一步描述这种信号从产生到递达之间的状态(信号阻塞与未诀): 那是怎么来决定的呢?下面慢慢来举例分解: 所以,通过这些图,可以描述信号从产生到递达的一个过程,上面的理解起来可能有点难,下面会用代码来进一步阐述,在进行实验之前,还需了解一些函数的使用,这些函数在实验中都会被用到,也就是信号集操作函数. 信号集操作函数: 其中解释一下sigset_t,百度百科解释为: 而这个函数的意义就是将这64位清0 这个函数的意义

linux系统编程视频 百度网盘下载

本帖最后由 雇佣兵333 于 2015-5-19 16:15 编辑 c教程目录: Linux开发快速入门培训gcc快速入门Makefile快速入门GDB快速入门 Linux系统编程之文件篇01认识计算机系统(上)计算机系统组成计算机系统硬件组成总线I/O设备内存处理器(运算器+控制器) 02认识计算机系统(下)什么是操作系统Linux内核模块操作系统管理硬件操作系统三个基本抽象进程上下文切换进程虚地址空间虚拟文件系统(VFS) 03系统编程介绍系统编程与应用编程系统资源系统调用系统调用与C库关系

LINUX系统编程 由REDIS的持久化机制联想到的子进程退出的相关问题

19:22:01 2014-08-27 引言: 以前对wait waitpid 以及exit这几个函数只是大致上了解,但是看REDIS的AOF和RDB 2种持久化时 均要处理子进程运行完成退出和父进程需要做的什么事情,所以特定看了UNIX环境编程和LINUX系统编程这2本书 重新梳理下整个要点. 内容: 一般而言: 如果程序类似于下面的情况: if((pid=fork())==0) { dochildtthing(); exit(0); } else if(pid>0) { dofathertt

Linux系统编程-setitimer函数

功能:linux系统编程中,setitimer是一个经常被使用的函数,可用来实现延时和定时的功能. 头文件:sys/time.h 函数原型: int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 参数含义: 1.which参数用来设置定时器类型,可选的值为 (1)ITIMER_REAL : 设置定时器以系统真实所花费的时间来计时,运行指定时间后发送SIGALRM信号. (

Linux系统编程@进程通信(一)

进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统的一个分支) POSIX进程间通信(POSIX:可移植操作系统接口,为了提高UNIX环境下应用程序的可移植性.很多其他系统也支持POSIX标准(如:DEC OpenVMS和Windows).) 现在Linux使用的进程间通信方式包括: 管道(pipe).有名管道(FIFO) 信号(signal) 消

嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl

嵌入式 Linux系统编程(二)--文件描述符控制函数fcntl 由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读.函数原型如下: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令

Linux环境编程之信号(一):信号基本概述

引言 假如在后台运行一个可执行程序./a.out,如果想终止该程序,通常会按下Ctrl-C,从而产生一个中断,其实这个过程的实现就是通过信号完成的.信号是软件中断,它提供了一种处理异步事件的方法. (一) 每个信号都有一个名字,这些名字都以三个字符SIG开头.例如SIGALARM是闹钟信号,当由alarm函数设置的计时器超时后产生此信号.Linux除支持31种不同信号外,还支持应用程序额外定义信号.信号定义在<bits/signum.h>中,也可以通过命令kill -l查看. (二)信号的产生

linux系统编程综合练习-实现一个小型的shell程序(四)

上节中已经对后台作业进行了简单处理,基本上要实现的功能已经完了,下面回过头来,对代码进行一个调整,把写得不好的地方梳理一下,给代码加入适当的注释,这种习惯其实是比较好了,由于在开发的时候时间都比较紧,都只是想办法去尽快实现,而肯定会有一些代码是写得不太好的,所以有时间的话最好是从头至尾将整个代码进行梳理,也许在梳理的过程中会发现许多不足的地方,好了,下面开始: 而这个信号安装函数是在init.c中实现的: 接下来进行shell循环: 它的实现是在parse.c中: 如注释所示,可以挪至init.

Linux环境编程之信号(三):一些信号函数

(一)kill和raise函数 kill函数将信号发送给进程或进程组.raise函数则允许进程自身发送信号. #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); int raise(int  signo);  //返回值:若成功则返回0,若出错则返回-1. 参数:pid参数有4种情况:1.pid > 0 将信号发送给进程为pid的进程.2.pid == 0 将该信号发送给与发送进程属