信号-signal

1、Kill:调用kill函数终止进程

#include <sys/types.h>

#include <signal.h>

int kill(pid_t pid, int signum);

功能:给指定的进程发送编号为signum的信号。

返回值:成功返回0,失败返回-1.

>> pid的取值有4种情况:

1)pid>0:将信号传送给进程ID为pid的进程。(单个进程)

2)pid=0:将信号传送给当前进程所在进程组中的所有进程。

3)pid=-1:将信号传送给系统内的所有进程。

4)pid<-1:将信号传给指定进程组的所有进程,这个进程组号等于pid的绝对值


2、Alarm

#include<unistd.h>

unsigned int alarm(unsigned int seconds); //类似定时自杀,定时器。只是设置,并不会阻塞。

功能:在seconds秒之后,向调用进程发送一个SIGALRM信号,SIGALRM信号的默认动作是终止调用alarm函数的进程

返回值:若以前没有设置过定时器,或设置的定时器已超时,返回0.否则返回定时器剩余的秒数,并重新设置定时器。

3、Raise

#include<signal.h>

int raise(int signum);

功能:给当前进程/调用raise的进程本身送一个信号

参数:signum是信号的编号

返回值:成功返回0,失败返回-1.

用kill函数也可以实现此功能,kill加上自己的pid。Kill不仅可以给自己发信号,还可以给别人发信号。 

4、Abort:是一个库函数

#include<stdlib.h>

void abort(void);

功能:向进程发送一个SIGABRT信号,默认情况下进程会退出。

注意:即使SIGABRT信号被加入阻塞集,一旦进程调用了abort函数,进程也还是会终止,且在终止前会刷新缓冲区,关文件描述符。

5、Pause

#include<unistd.h>

int pause(void);

功能:将调用进程挂起(阻塞)直至捕捉到信号为止。这个函数通常用于判断信号是否已到

返回值:直到捕获到信号,pause函数才返回-1,且errno被设置成EINTR。

一个进程收到一个信号的时候,可以用如下方法进行处理:

1>执行系统默认动作:对大多数信号来说,系统默认动作是用来终止该进程。

2>忽略此信号:接收到此信号后没有任何动作。

3> 执行自定义信号处理函数:使用用户自己定义的信号处理函数处理该信号。程序中可用函数signal()改变信号的处理方式。

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

void signal_handler(int sign)
{
        if(sign == SIGINT)//Ctrl + C
                printf("rev SIGINT\n");
        if(sign == SIGQUIT)//Ctrl + \ //
                printf("rev SIGQUIT\n");
}

int main(int argc,char * argv[])
{
        printf("wait for SIGINT or SIGQUIT.\n");
        signal(SIGINT,signal_handler);
        signal(SIGQUIT,signal_handler);
        pause();
        pause();
        return 0;
}

运行结果如下:


按ctrl+c,打印SIGINT。

按ctrl+\ , 打印SIGQUIT。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值