1、kill函数

int kill(pid_t pid, int sig);

发送信号给指定的进程。

(1)

If pid is positive, then signal sig is sent to the process with the ID specified by pid.

如果pid是正数,则发送信号sig给进程号为pid的进程。

(2)

If pid equals 0, then sig is sent to every process in the process group of the calling process.

如果pid是正数,则发送信号sig给当前进程所属进程组里的所有进程

(3)

如果pid是-1,则把信号sig广播给系统内除1号进程(init进程)和自身以外的所有进程。

(4)

如果pid比-1还小,则发送信号sig给属于进程组-pid的所有进程

(5)

如果参数sig是0,则kill仍执行正常的错误检查,但不发送信号。可以利用这一点来确定某个进程

是否有权向另外一个进程发送信号。如果向一个并不存在的进程发送空信号,则kill返回-1,errno则

被设置为ESRCH

注意:

非root权限的进程只能向属于同一个组或同一个用户的进程发送信号。

2、raise函数

raise是从ANSI C而非POSIX标准定义的,用来给调用它的进程发送信号,

3、sigqueue函数

int sigqueue(pid_t pid, int sig, const union sigval value);

支持信号带有参数,从而可以与函数sigaction配合使用。

sigaction不能给一组进程发送信号。

sigval是一个共用体,

union sigval {
int sival_int;
void *sival_ptr;
};

也就是说,信号携带的参数要么是一个整型,要么是一个void型指针。当接收进程的信号处理函数是由

sigaction函数设置的,并且设置了SA_SIGINFO标志(表明使用3参数的sa_sigaction设置信号处理函数)时,接收进程可以

从siginfo_t结构的si_value域取得信号发送时携带的数据。

4、alarm函数

可以用来设置定时器,定时器超时将产生SIGARLM信号给调用进程。

unsigned int alarm(unsigned int seconds);

If seconds is zero, no new alarm() is scheduled.

In any event any previously set alarm() is canceled.

经过seconds秒之后,内核将给调用该函数的进程发送SIGARLM信号。如果seconds为0,则不再发送SIGARLM信号,

最新一次调用alarm函数将取消之前一次的设定。

注意:alarm只设定为发送一次信号,如果要发送多次,就要对alarm进行多次调用。

#include <stdio.h>
#include <signal.h>
#include <setjmp.h> void hand_sig(int); int main()
{ signal(SIGALRM, hand_sig); raise(SIGALRM); while(); return ;
} void hand_sig(int sig_num)
{
printf("recv ALARM\n");
alarm();
return;
}

./main
recv ALARM
recv ALARM
recv ALARM

5、getitimer/setitimer函数

int getitimer(int which,  struct itimerval *curr_value);
int setitimer(int which,  const struct itimerval *new_value, struct itimerval *old_value);

setitimer函数也是用来设置定时器的,且alarm和setitimer使用同一个定时器,因此会相互影响。setitimer要比alarm具有更多功能,

第一个参数which用来指定使用哪一个定时器,根据参数which可单独设定每个定时器,定时器的种类:

(1)ITIMER_REAL 按实际时间计算,发送SIGALRM信号

(2)ITIMER_VIRTUAL 仅当进程执行时才进行计算,发送SIGVTALRM信号。

(3)ITIMER_PROF 进程执行的时间以及内核因本进程而消耗的时间都计时。与ITIMER_VIRTUAL搭配使用,通常

用来统计进程在用户态与核心态花费的时间总和,计时到达发送SIGPROF信号。

Timer values are defined by the following structures:

struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};

struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};

对于函数int getitimer(int which,  struct itimerval *curr_value);如果存在由which指定的定时器,则将剩余时间保存在it_value中,

该定时器的初始值保存在it_interval中;如果不存在指定类型的定时器,则将curr_value置为0返回。

对于函数int setitimer(int which,  const struct itimerval *new_value, struct itimerval *old_value);

参数old_value如果不是空指针,则将在其中保存上次设置的定时器的值。定时器从new_value递减为0时,产生一个信号,

并将it_value的值设置为it_interval,然后重新开始计时,如此周而复始。仅当it_value的值为0或者计时到达而it_interval的值为0时,停止计时。

#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <sys/time.h> void hand_sig(int); int main()
{
struct itimerval tval;
tval.it_value.tv_sec = ;//第一次1秒触发
tval.it_value.tv_usec = ;
tval.it_interval.tv_sec = ;//第二次开始每5秒钟触发
tval.it_interval.tv_usec = ; //安装信号处理函数
signal(SIGALRM, hand_sig);
signal(SIGPROF, hand_sig); setitimer(ITIMER_REAL, &tval, NULL);
setitimer(ITIMER_PROF, &tval, NULL); while(); return ;
} void hand_sig(int sig_num)
{
if(SIGALRM == sig_num)
{
printf("recv SIGALRM\n");
}
else
{
printf("recv SIGPROF\n");
} return;
}

执行结果:

recv SIGALRM
recv SIGPROF
recv SIGALRM
recv SIGPROF
recv SIGALRM
recv SIGPROF

..........

程序设置了两个定时器:ITIMER_REAL 和ITIMER_PROF,从执行结果可以看出SIGALRM先于SIGPROF出现,且总体上SIGALRM的次数要多于SIGPROF的次数,

这符合预期,因为整个系统并不是只运行这一个进程。

6、abort函数

void abort(void);

用来向进程发送SIGABRT信号。如果进程设置信号处理函数以捕捉SIGABRT信号,且信号处理函数不返回(如调用setjmp,longjmp),则

abort不能终止进程。abort终止进程时,所有打开的流(I/O流,文件流)均会被刷新和关闭。如果进程设置了SIGABRT被阻塞或忽略,abort

将覆盖这种设置。

abort函数没有返回值。

信号的发送kill,raise,alarm,setitimer,abort,sigqueue的更多相关文章

  1. 系统编程-信号-信号发送kill、raise、alarm

    信号发送 kill 和 raise函数 kill函数参数详解: 实验1 raise和kill 的使用 #include <stdio.h> #include <signal.h> ...

  2. linux系统编程之信号(四):alarm和可重入函数

    一,alarm() 在将可重入函数之前我们先来了解下alarm()函数使用: #include <unistd.h> unsigned int alarm(unsigned int sec ...

  3. sleep usleep nanosleep alarm setitimer使用

    sleep使用的是alarm之类的定时器,定时器是使得进程被挂起,使进程处于就绪的状态. signal+alarm定时器 alarm参数的类型为uint, 并且不能填0 #include <st ...

  4. Linux下多任务间通信和同步-信号

    Linux下多任务间通信和同步-信号 嵌入式开发交流群280352802,欢迎加入! 1.概述 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.信号可以直接进行用户空间进程和内核进程之间的 ...

  5. linux进程篇 (三) 进程间的通信2 信号通信

    2. 信号通信 用户空间 进程A <----无法通信----> 进程B -----------------|--------------------------------------|- ...

  6. Linux信号

    信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...

  7. Linux Communication Mechanism Summarize

    目录 . Linux通信机制分类简介 . 控制机制 0x1: 竞态条件 0x2: 临界区 . Inter-Process Communication (IPC) mechanisms: 进程间通信机制 ...

  8. linux系统编程之信号(六):信号发送函数sigqueue和信号安装函数sigaction

    一,sigaction() #include <signal.h> int sigaction(int signum,const struct sigaction *act,struct ...

  9. linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

随机推荐

  1. PHP进程及进程间通信

    一.引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.换句话说就是,在系统调度多个cpu的时候,一个程序的基本单元.进程对于大多数的语言都不是一个陌生的概念,作为"世界上最好 ...

  2. 06: Django Admin

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  3. 20145313张雪纯Exp8 Web基础

    回答问题 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域:包含了文本框. ...

  4. 20145335郝昊《网络攻防》Exp7 网络欺诈技术防范

    20145335郝昊<网络攻防>Exp7 网络欺诈技术防范 实验内容 本次实践本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 简单应用SET工具建立冒名网站. ...

  5. FSMC(STM32)

    (一)FSMC:Flexible Static Memory Controller,可变(灵活)静态存储控制器 小容量产品是指闪存存储器容量在1 6K至32K 字节之间的STM32F101xx.STM ...

  6. Git 基础 —— 安装 配置 别名 对象

    Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 Git 安装 Git下载地址 ...

  7. JavaScript 题目

    1. ],b=a; b[]=; console.log(a+b); a=[], b=a, b=[]; console.log(a+b); 2.快速排序法 var quickSort = functio ...

  8. 51NOD 1069 Nim游戏

    1069 Nim游戏   有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出 ...

  9. 精巧好用的DelayQueue 转

    我们谈一下实际的场景吧.我们在开发中,有如下场景 a) 关闭空闲连接.服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之.b) 缓存.缓存中的对象,超过了空闲时间,需要从缓存中移出.c) 任务超 ...

  10. 初探 Yii2 的测试模式 index-test.php

    有没有发现高级版每个应用的 web 目录下有两个入口文件,一个index.php 一个 index-test.php通过init.bat可以切换到调试模式和产品模式,这两个模式相信同学们都很熟悉了,那 ...