linux 如何linux 自定义信号号

博客分类:
sigaction(查询或设置信号处理方式)
signal,sigprocmask,sigpending,sigsuspend
#include&signal.h&
int sigaction(int signum,const struct sigaction *act
,struct sigaction *oldact);
sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。如参数结构sigaction定义如下
sigaction{void (*sa_handler) (int);sigset_t sa_int
sa_void (*sa_restorer)
sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。sa_mask
用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。sa_restorer 此参数没有使用。sa_flags
用来设置信号处理的其他相关操作,下列的数值可用。OR 运算(|)组合A_NOCLDSTOP :
如果参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程SA_ONESHOT/SA_RESETHAND:当调用新的信号处理函数前,将此信号处理方式改为系统预设的方式。SA_RESTART:被信号中断的系统调用会自行重启SA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来。如果参数oldact不是NULL指针,则原来的信号处理方式会由此结构sigaction
执行成功则返回0,如果有错误则返回-1。
EINVAL 参数signum 不合法,
或是企图拦截SIGKILL/SIGSTOPSIGKILL信号EFAULT 参数act,oldact指针地址无法存取。EINTR
此调用被中断
#include &stdio.h&
#include &signal.h&
#include &unistd.h&
void show_handler(int sig)
printf("I got signal %d\n", sig);
for(i = 0; i & 5; i++) {
printf("i = %d\n", i);
int main(void)
int i = 0;
struct sigaction act,
act.sa_handler = show_
sigaddset(&act.sa_mask, SIGQUIT); //见注(1)
act.sa_flags = SA_RESETHAND | SA_NODEFER; //见注(2)
//act.sa_flags = 0; //见注(3)
sigaction(SIGINT, &act, &oldact);
while(1) {
printf("sleeping %d\n", i);
sigaddset(增加一个信号至信号集)
sigemptyset,sigfillset,sigdelset,sigismember
#include&signal.h&
int sigaddset(sigset_t *set,int
sigaddset()用来将参数signum 代表的信号加入至参数set
信号集里。
执行成功则返回0,如果有错误则返回-1。
EFAULT 参数set指针地址无法存取EINVAL
参数signum非合法的信号编号
sigprocmask(查询或设置信号遮罩)
signal,sigaction,sigpending,sigsuspend
#include&signal.h&
int sigprocmask(int how,const sigset_t *set,sigset_t *
sigprocmask()可以用来改变目前的信号遮罩,其操作依参数how来决定SIG_BLOCK
新的信号遮罩由目前的信号遮罩和参数set 指定的信号遮罩作联集SIG_UNBLOCK
将目前的信号遮罩删除掉参数set指定的信号遮罩SIG_SETMASK
将目前的信号遮罩设成参数set指定的信号遮罩。如果参数oldset不是NULL指针,那么目前的信号遮罩会由此指针返回。
执行成功则返回0,如果有错误则返回-1。
EFAULT 参数set,oldset指针地址无法存取。EINTR 此调用被中断
#include &signal.h&
#include &stdio.h&
#include &string.h&
#include &errno.h&
#include &unistd.h&
#define PROMPT "你想终止程序吗?"
char *prompt=PROMPT;
void ctrl_c_op(int signo)
write(STDERR_FILENO,prompt,strlen(prompt));
int main()
act.sa_handler=ctrl_c_
sigemptyset(&act.sa_mask);
act.sa_flags=0;
if(sigaction(SIGINT,&act,NULL)&0)
fprintf(stderr,"Install Signal Action Error:%s\n\a",strerror(errno));
#include &unistd.h&
#include &stdio.h&
#include &errno.h&
#include &fcntl.h&
#include &signal.h&
#include &string.h&
#include &pwd.h&
#include &sys/types.h&
#include &sys/stat.h&
/* Linux 的默任个人的邮箱地址是 /var/spool/mail/ */
#define MAIL_DIR "/var/spool/mail/"
/* 睡眠10 秒钟 */
#define SLEEP_TIME 10
#define MAX_FILENAME 255
unsigned char notifyflag=1;
long get_file_size(const char *filename){
if(stat(filename,&buf)==-1){
if(errno==ENOENT)return 0;
else return -1;
return (long)buf.st_
void send_mail_notify(void){
fprintf(stderr,"New mail has arrived\007\n");
void turn_on_notify(int signo){
notifyflag=1;
void turn_off_notify(int signo){
notifyflag=0;
int check_mail(const char *filename){
long old_mail_size,new_mail_
sigset_t blockset,
sigemptyset(&blockset);
sigemptyset(&emptyset);
sigaddset(&blockset,SIGUSR1);
sigaddset(&blockset,SIGUSR2);
old_mail_size=get_file_size(filename);
if(old_mail_size&0)return 1;
if(old_mail_size&0) send_mail_notify();
sleep(SLEEP_TIME);
if(sigprocmask(SIG_BLOCK,&blockset,NULL)&0) return 1;
while(notifyflag==0)sigsuspend(&emptyset);
if(sigprocmask(SIG_SETMASK,&emptyset,NULL)&0) return 1;
new_mail_size=get_file_size(filename);
if(new_mail_size&old_mail_size)send_mail_
old_mail_size=new_mail_
sleep(SLEEP_TIME);
int main(void){
char mailfile[MAX_FILENAME];
struct passwd *
if((pw=getpwuid(getuid()))==NULL){
fprintf(stderr,"Get Login Name Error:%s\n\a",strerror(errno));
strcpy(mailfile,MAIL_DIR);
strcat(mailfile,pw-&pw_name);
newact.sa_handler=turn_on_
newact.sa_flags=0;
sigemptyset(&newact.sa_mask);
sigaddset(&newact.sa_mask,SIGUSR1);
sigaddset(&newact.sa_mask,SIGUSR2);
if(sigaction(SIGUSR1,&newact,NULL)&0)
fprintf(stderr,"Turn On Error:%s\n\a",strerror(errno));
newact.sa_handler=turn_off_
if(sigaction(SIGUSR1,&newact,NULL)&0)
fprintf(stderr,"Turn Off Error:%s\n\a",strerror(errno));
check_mail(mailfile);
这个程序会在也可以检查用户的邮件.不过提供了一个开关,如果用
户不想程序提示有新的邮件到来,可以向程序发送SIGUSR2 信号,如果想程序提供提示可以
发送SIGUSR1 信号.
浏览 10288
home198979
浏览: 1013123 次
来自: 深圳
浏览量:59457
浏览量:32871
浏览量:50820
不一定哦,就算大小相当,in 和 exists的性能也会很大差 ...
[size=x-small][/size]
q 写道还是佩服写c的用其它语言一样可以实现 ...
还是佩服写c的
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'gtk中自定义信号的用法?
[问题点数:50分,结帖人zhouxinfengone]
gtk中自定义信号的用法?
[问题点数:50分,结帖人zhouxinfengone]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年11月 Linux/Unix社区大版内专家分月排行榜第二2011年8月 Linux/Unix社区大版内专家分月排行榜第二2008年10月 C/C++大版内专家分月排行榜第二
2012年8月 Linux/Unix社区大版内专家分月排行榜第三
2008年9月 C/C++大版内专家分月排行榜第二2008年4月 C/C++大版内专家分月排行榜第二2008年2月 C/C++大版内专家分月排行榜第二2007年7月 C/C++大版内专家分月排行榜第二
2011年10月 C/C++大版内专家分月排行榜第三2009年1月 C/C++大版内专家分月排行榜第三2008年10月 C/C++大版内专家分月排行榜第三2008年5月 C/C++大版内专家分月排行榜第三2007年6月 C/C++大版内专家分月排行榜第三2007年5月 C/C++大版内专家分月排行榜第三
2005年1月 C/C++大版内专家分月排行榜第二
匿名用户不能发表回复!|扫一扫体验手机阅读
信号及信号处理 (《linux c 程序大全学习笔记》)
<span type="1" blog_id="1011503" userid='
分享到朋友圈
关注作者,不错过每一篇精彩linux用户自定义信号_中华文本库
第四讲_Linux信号 45页 免费 Linux信号与信号处理 31页 1财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
的Unix系统中就已经被引入了,用于 在用户态进程间...会定义一些缺省的信号处理程序
Linux OS...
Linux信号与信号处理_IT/计算机_专业资料。Linux信号个人总结信号(signal)是一种...同时还定义 了一族用于处理信号集的函数。 这样用户可以不必关心信号集的实现, ...
实验三 linux进程信号通信 linux 一、实验目的了解linux中的信号,熟悉linux系统中...终止进程 用户自定义信号1 用户自定义信号2 某个子进程死 电源故障 function:...
Linux下的信号事件_IT/计算机_专业资料。编程系列教程Linux下的信号事件 Linux下的信号处理函数: 信号的产生 信号的处理 其它信号函数 一个实例 1。信号的产生 Lin...
31)SIGRTMIN~(64)SIGRTMAX:LINUX 的实时信号,它们没有固定的含义(可以由用户自 定义) 。所有的实时信号的默认动作都为终止进程。 ...
Linux信号处理_计算机软件及应用_IT/计算机_专业资料...它们在 系统头文件&signal.h&中定义,也可以通过在...例如连接到终端的进程,用户 按下 CTRL+c,将导致...
Linux 信号 signal 处理机制 信号是 Linux 编程中非常重要的部分,本文将详细介绍...17 A 用户自定义信号 2 SIGCHLD 20,17,18 B 子进程结束信号 SIGCONT 19,...
Linux 李杰聪 号 信号概念信号是软件中断。它即可以作为进程间通信的一种机制,...带外数据。 用户自定义信号 用户自定义信号 产生。 有setitimer产生。 产生 ...
Linux 信号说明表: 信号说明表: Signal SIGABRT SIGALRM SIGBUS SIGCANCEL ...用户自定义 signal 1 用户自定义 signal 2 setitimer 函数设置的 Virtual ...【图文】LINUX信号_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
&&LINUX信号
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢

我要回帖

更多关于 linux 用户自定义信号 的文章

 

随机推荐