赞
踩
信号是事件发生时对进程的通知机制。
标准信号
标准信号的局限性:
阻塞信号可能会丢失。当一个信号阻塞时,这个信号即使多次发送给进程,也被执行一次信号句柄。
信号交付没有携带与信号有关信息。接受到信号的进程无法区分同种信号的不同情况,也不知道信号从何而来。
信号的交付没有优先级。当有多个信号悬挂与一个进程时,交付的顺序不确定。
实时信号
实时信号对标准信号做了一下扩充,有以下的特点:
增加了信号从SIGRTMIN到SIGRTMAX的实时信号,可以通过sysconf(_SC_RTSIG_MAX)获得当前操作系统支持的实时信号的个数。
实时信号在队列中并按顺序交付。同一类型的实时信号将按顺序交付给进程。
实时信号可以携带额外的信息。
进程能够通过专门的函数更快的回复信号。
当定时器到期、空消息队列有消息到达、有异步IO完成时,信号能够及时交付给进程。
1.默认处理:
2.忽略处理:
不能忽略SIGKILL和SIGSTOP
3.捕获并处理:
不能捕获SIGKILL和SIGSTOP
列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。
kill -信号 进程id
kill命令是使用kill函数实现的。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
pid:指定哪个进程
kill还有一个特殊的用途:当sig=0时,表示无信号发送,调用kill()函数会去执行错误检查,查看是否可以向目标进程发送信号。这也就意味着可以指定空信号来检测ID进程是否存在。
#include <signal.h>
int raise(int sig);
系统调用函数
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
handler一般格式:
void handler(int sig)
{
//处理程序
}
信号处理器程序时当指定信号传递给进程时将会调用的一个函数。
调用信号处理程序,可能会随时打断主程序流程,内核代表进程来调用处理器程序,当处理器程序返回时,主程序会在打断的位置处恢复执行。
信号处理器程序设计原则:力求简单。
void handler(int sig) //处理器程序
{
printf("ctrl + c\n");
}
int main()
{
int sig = SIGINT; //信号
if(signal(sig,handler) == SIG_ERR)
perror("signal"),exit(1);
int i = 0;
while(1)
{
printf("%c ",i%26+'a');
fflush(stdout);
i++;
sleep(1);
}
return 0;
}

执行结果:
当键入Ctrl+C时,会去执行信号处理程序,进程不会结束,执行完毕再返回继续执行主程序,最后发送SIGQUIT(Ctrl + \)信号,默认执行核心转储,进程退出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。