信号

信号:是UNIX和LINUX系统响应某些条件而产生的一个事件。是由于某些错误条件而产生的,如内存冲突、浮点处理器错误或非法指令等。它们由shell和终端处理器引起的中断,他们还可以作为在进程中传递消息或修改行为的一种方式,明确的由一个进程发送给另外一个进程。无论何种情况,他们的编程接口都是相同的。信号可以被捕获,响应或者忽略。


术语生成(raise): 表示一个信号的产生。
术语捕获(catch):表示接受到一个信号。
信号可以被生成,捕获,响应或忽略。
定义在头文件signal.h中。

如果进程中收到其中的一个信号,而没有捕获它,那么进程会立即终止。

SIGHLD 子进程已经停止或者退出。在默认情况下是被忽略的。
SIGCONT的作用是让进程恢复并继续执行。

Ctrl+C组合键会向正在运行的程序发送SIGINT信号,终止该程序。除非它事先捕获了这个程序。
程序可以用signal库函数来处理信号,它的定义如下:
#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int , sighandler_t handler);

int signum,:指定的信号
sighandler_t handler:信号处理函数,以下可以代替信号处理函数
SIG_ING                                         忽略信号
SIG_DFL                                         恢复默认行为      
                        
信号处理:捕获到Ctrl+C后,调用信号处理函数,然后将信号SIGINT设置为默认行为。
#include<signal.h>
#include<stdio.h>
#include<unistd.h>

void func(int sig)
{
    printf("sig = %d\n",sig);
    signal(SIGINT,SIG_DFL);
}

int main()
{
    signal(SIGINT,func);

    while(1)
    {
        printf("HI\n");
        sleep(1);
    }
    exit(0);
}

返回值返回先前对指定信号的处理函数的函数指针,如果没有信号处理函数,则返回SIG_ERR并设errno为一个

正数。如果给出的是一个无效的信号,或者不可捕获或者不可忽略的信号(SIGKILL),error将会设为EINVAL

2.发送信号

#include<sys/type.s>
#include<signal.h>

int kill(pid_t pid,int sig);
成功返回0
失败返回 -1。失败的原因:给定的信号无效(errno:EINVAL);发送得权限不够(errno:EPERM);目标进程并不存在(errno:ESRCK)


#include <unistd.h>

 unsigned int alarm(unsigned int seconds);

在seconds后发送一个SIGALRM(超时警告)信号。


一个健壮的信号接口
#include <signal.h>

int sigaction(int signum, const struct sigaction *act,
                     struct sigaction *oldact);

信号集
	#include <signal.h>

       int sigemptyset(sigset_t *set);

       int sigfillset(sigset_t *set);

       int sigaddset(sigset_t *set, int signum);

       int sigdelset(sigset_t *set, int signum);

       int sigismember(const sigset_t *set, int signum);


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值