1. 概念:

  1)信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式

  2)信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。

  3)如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被 取消时才被传递给进程。

2.用户进程对信号的响应方式:

  1)忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP。

  2)捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。

  3)执行缺省操作:Linux对每种信号都规定了默认操作

3.信号:

  SIGINT:ctrl+c 终止信号

  SIGQUIT:ctrl+\ 终止信号

  SIGTSTP:ctrl+z 暂停信号

  SIGALRM:闹钟信号 收到此信号后定时结束,结束进程

  SIGCHLD:子进程状态改变,父进程收到信号

  SIGKILL:杀死信号

4.相关函数:
1)int kill(pid_t pid, int sig);
  功能:信号发送
  参数:pid:指定进程
  sig:要发送的信号
  返回值:成功 0;失败 -1
2)int raise(int sig);
  功能:进程向自己发送信号
  参数:sig:信号
  返回值:成功 0;失败 -1
3)unsigned int alarm(unsigned int seconds)
  功能:在进程中设置一个定时器
  参数:seconds:定时时间,单位为秒
  返回值:如果调用此alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。

注意:一个进程只能有一个闹钟时间。如果在调用alarm时已设置过闹钟时间,则之前的闹钟时间被新值所代替

4)int pause(void);
  功能:用于将调用进程挂起直到收到信号为止。

5)void (*signal(int signum, void (*handler)(int)))(int);
  或者:
  typedef void (*sighandler_t)(int);
  sighandler_t signal(int signum, sighandler_t handler);
  功能:信号处理函数
  参数:signum:要处理的信号//不能是SIGKILL和SIGSTOP
    handler:SIG_IGN:忽略该信号。
    SIG_DFL:采用系统默认方式处理信号。
    自定义的信号处理函数指针
  返回值:成功:设置之前的信号处理方式;失败:SIG_ERR

6)void abort(void);

  给自己发送异常终止信号,(6.SIGABRO)终止并产生core文件。

例子:kill 函数发送杀死pid指向的进程的信号,raise 发送杀死自己的信号

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
pid_t pid;
pid = fork();
if(pid < )
{
perror("fork fail ");
exit();
}
else if(pid == )
{
printf("child \n");
}
else
{
kill(pid,SIGKILL);//(此处pid是子进程的进程号)杀死 pid 发送进程的信号,kill 给其他进程发送信号,指定进程号
printf("child killed\n");
sleep();
printf("father \n");
wait(NULL); //等待子进程结束,并回收子进程资源
raise(SIGKILL); //杀死自己的信号,函数raise 给自己发送信号
}
return ;
}

测试:子进程还未来得及运行就被杀死了

例子2: 定时器的使用

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> int main(int argc, const char *argv[])
{
printf("%d\n",alarm()); //7 秒定时器,此时返回 0 ,前面没有使用定时器
sleep(); //睡 2 秒
while()
{
printf("%d\n",alarm()); //重新设置定时器值为 3 ,返回上次定时器剩余的时间,7-2 = 5
sleep(); //睡7秒,后会结束进程
}
return ;
}

测试:Alarm clock 是定时器结束时提醒

 signal 信号使用例子1 : 

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> void handler(int arg)
{
printf("\nctrl + c\n");
// exit(1);
// raise(SIGKILL);
kill(getpid(),); //9表示 SIGKILL 杀死信号
} int main(int argc, const char *argv[])
{
signal(SIGINT,handler);//定义自己的处理信号,当SIGINT信号发生时,调用 handler 函数处理
while();
return ;
}

测试:

 signal 信号使用例子2 : 

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, const char *argv[])
{
signal(SIGINT,SIG_IGN);// ctrl +c 信号被忽略,SIG_IGN 表示忽略该信号
while(); return ;
}

测试: 通过 ctrl + c 信号不能终止这个进程

Linux 进程间通信 信号(signal)的更多相关文章

  1. Linux进程间通信——信号集函数

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  2. 详解linux进程间通信-信号

    前言:之前说看<C++ Primer >暂时搁浅一下,迷上公司大神写的代码,想要明白,主要是socket.进程间通信! 知道进程间通信:信号.信号量.管道.消息队列.共享内存(共享存储), ...

  3. python进程间通信--信号Signal

    信号signal 是python进程间通信多种机制中的其中一种机制.可以对操作系统进程的控制,当进程中发生某种原因而中断时,可以异步处理这个异常. 信号通过注册的方式‘挂’在一个进程中,并且不会阻塞该 ...

  4. Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)

    信号  ( signal ) 机制是 UNIX 系统中最为古老的进程间通信机制,很多条件可以产生一个信号. 信号的产生: 1,当用户按下某些按键时,产生信号. 2,硬件异常产生信号:除数为 0 ,无效 ...

  5. Linux进程间通信—信号

    三.信号(Signal) 信号是Unix系统中使用的最古老的进程间通信的方法之一.操作系统通过信号来通知某一进程发生了某一种预定好的事件:接收到信号的进程可以选择不同的方式处理该信号,一是可以采用默认 ...

  6. Linux进程间通信——信号

    一.认识信号 信号(Signals)是Unix.类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式.它是一种异步的通知机制,用来提醒进程一个事件已经发生.当一个信号发送给一个进程 ...

  7. Linux进程间通信-信号

    1.什么是信号信号是Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作. 2.信号的产生1)由硬件产生,如从键盘输入Ctrl+C可以终止当前进程2)由其他进程发送,如可在s ...

  8. Linux进程间通信(一): 信号 signal()、sigaction()

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  9. [转]Linux进程间通信——使用信号

    转载于:http://blog.csdn.net/ljianhui/article/details/10128731         经典!!! Linux进程间通信——使用信号 一.什么是信号 用过 ...

随机推荐

  1. 【题解】Ride to Office

    题目描述 起点与终点相隔4500米.现Charley 需要从起点骑车到终点.但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑.而当他遇到以更快的速度骑车的人时,他会以相应的速度 ...

  2. 关于软件IntelliJ IDEA的使用技巧(一)

    一,IntelliJ IDEA的下载 点击网址http://www.jetbrains.com/idea/进入官网,点击Download 会出现如下页面 点击Ultimate下的Download,下载 ...

  3. springboot整合jsp 遇到的问题

    1,在idea中新建jsp文件 首先需要在springboot项目 在src 中webapp /WEB-INF/JSP 当我右键想新建一个jsp文件时默认没有 File->Project Str ...

  4. Spring学习笔记(4)——IoC学习

    IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表 ...

  5. XStream的简单使用

    XStream XStream是一个java对象和xml相互转换的工具 创建XStream对象:XStream stream = new XStream() Java对象转换成xml:stream . ...

  6. WPF 从服务器下载文件

    1.先获取服务器下载地址,给出要下载到的目标地址 public void DownloadFileFromServer() { string serverFilePath = "http:/ ...

  7. Spring定时任务的几种实现(转)

    转自:http://gong1208.iteye.com/blog/1773177 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几 ...

  8. javascript笔记 (持续更新)

    1. 语言主要分为两大类:编译型语言和解释型语言. 对于静态语言来说(如Java.C++.C),处理上述这些事情的叫编译器(Compiler),相应地对于JavaScript这样的动态语言则叫解释器( ...

  9. concurrent=false/true的定时任务job策略介绍

    前言: 四种测试情况,cronExpression = 0/30 * * * * ? : 1,一个trigger,job设置的是每30s执行一次,实际需要75s:concurrent=false: 2 ...

  10. 【JZOJ6431】【luoguP5658】【CSP-S2019】括号树

    description analysis 用栈维护一下树上路径未匹配的左括号,然后在树上找右括号匹配,设\(f[i]\)为\(i\)节点的贡献,\(g[i]\)是答案 为左括号可以直接继承父节点的信息 ...