进程、线程和进程间通信-信号

信号

信号机制

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 linux内核通过信号通知用户进程,不同的信号类型代表不同的事件

Linux对早期的unix信号机制进行了扩展

信号的产生:

1 按键产生

2 系统调用函数产生(比如raise, kill)

3 硬件异常

4 命令行产生 (kill)

5 软件条件(比如被0除,访问非法内存等)

进程对信号有不同的响应方式 

(1)缺省方式 (2) 忽略信号  (3)捕捉信号

常用信号

信号名

含义

默认操作

SIGHUP

该信号在用户终端关闭时产生,通常是发给和该

终端关联的会话内的所有进程

终止

SIGINT

该信号在用户键入INTR字符(Ctrl-C)时产生,内

核发送此信号送到当前终端的所有前台进程

终止

SIGQUIT

该信号和SIGINT类似,但由QUIT字符(通常是

Ctrl-\)来产生

终止

SIGILL

该信号在一个进程企图执行一条非法指令时产生

终止

SIGSEV

该信号在非法访问内存时产生,如野指针、缓

冲区溢出

终止

SIGPIPE

当进程往一个没有读端的管道中写入时产生,代

表“管道断裂”

终止

信号名

含义

默认操作

SIGKILL

该信号用来结束进程,并且不能被捕捉和忽略

终止

SIGSTOP

该信号用于暂停进程,并且不能被捕捉和忽略

暂停进程

SIGTSTP

该信号用于暂停进程,用户可键入SUSP字符(

通常是Ctrl-Z)发出这个信号

暂停进程

SIGCONT

该信号让进程进入运行态

继续运行

SIGALRM

该信号用于通知进程定时器时间已到

终止

SIGUSR1/2

该信号保留给用户程序使用

终止

SIGCHLD

是子进程状态改变发给父进程的。

忽略

 

信号相关命令 kill / killall 

kill [-signal] pid  

默认发送SIGTERM  

-sig 可指定信号  

pid  指定发送对象

killall [-u  user | prog]  

prog  指定进程名  

user  指定用户名

信号发送 – kill / raise

 #include  <unistd.h>
 #include <signal.h>
 int  kill(pid_t pid,  int sig);
 int  raise(int sig);       //给自己发信号

成功时返回0,失败时返回EOF  

pid 接收进程的进程号:     0代表同组进程; -1代表所有进程  

sig 信号类型

信号的函数:

int kill(pid_t pid, int signum)

功能:发送信号

参数:

pid: > 0:发送信号给指定进程

= 0:发送信号给跟调用kill函数的那个进程处于同一进程组的进程。

< -1: 取绝对值,发送信号给该绝对值所对应的进程组的所有组员。

= -1:发送信号给,有权限发送的所有进程。

signum:待发送的信号

int  raise(int sig);       

给自己发信号,等价于kill(getpid(), signo);

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main()
{

   //    kill(24149,11);//给某个进程发送一个信号
   //   raise(11);//给自己发信号
   alarm(3);//定时器3秒后结束
   pause();//进程一直阻塞,相当于while
   //   while(1){
   //   }
}

 

定时器函数

unsigned int alarm(unsigned int seconds);

功能:定时发送SIGALRM给当前进程

参数: seconds:定时秒数

返回值:上次定时剩余时间。

ualarm (循环发送)

useconds_t ualarm(useconds_t usecs, useconds_t interval);

以useconds为单位,第一个参数为第一次产生时间,第二个参数为间隔产生

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

功能:定时的发送alarm信号

参数:

which:

ITIMER_REAL:以逝去时间递减。发送SIGALRM信号

ITIMER_VIRTUAL: 计算进程(用户模式)执行的时间。 发送SIGVTALRM信号

ITIMER_PROF: 进程在用户模式(即程序执行时)和核心模式(即进程调度用时)均计算时间。 发送SIGPROF信号

new_value:  负责设定 timout 时间

old_value:   存放旧的timeout值,一般指定为NULL

struct itimerval {

struct timeval it_interval;  // 闹钟触发周期

struct timeval it_value;    // 闹钟触发时间

};
struct timeval {

    time_t      tv_sec;         /* seconds */

    suseconds_t tv_usec;        /* microseconds */

};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值