社区
Linux/Unix社区
帖子详情
一个信号处理的问题,急
upcuiling
2006-08-11 09:28:03
如何让一个进程在接收到某一信号前死循环的作一件事情,收到信号后就做另外一件事情。
最好能有例子
...全文
282
11
打赏
收藏
一个信号处理的问题,急
如何让一个进程在接收到某一信号前死循环的作一件事情,收到信号后就做另外一件事情。 最好能有例子
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
upcuiling
2006-08-12
打赏
举报
回复
在sig_usr1处理函数里面重置了信号,还是不行啊
DanXer
2006-08-12
打赏
举报
回复
你把,下面两行去掉,
sigaddset(&sigzero,SIGUSR1);
sigaddset(&sigzero,SIGUSR2);
linux上现在还没有真正的pselect 所以上面两行作用基本上不会起作用,但可能阻塞信号。
将pselect(0,NULL,NULL,NULL,&ti,&sigzero);的超时参数&ti置为NULL再试试。
另外:用signal处理信号只处理一次,多次触发需要再次安装。只有在bsd4.2的信号语义中,signal才是多次的。所以signal函数不具有移植性。现在没人用了,都使用sigaction,它是posix标准,将struct sigaction::sa_flags置为SA_RESTART来使用多次BSD信号语义。
qdhuxp
2006-08-11
打赏
举报
回复
用3个信号函数
1.signal() //运行函数
2.sigismember() //判断某一信号
3.sigdelset() //删除某一信号
假设你的进程函数action()主函数main()
void action()
{
sigset_t sigset;
while(sigismember(&sigset,SIG1))
{
//做第一件事
if(sigismember(&sigset,SIG2))
{
//做第二件事
sigdelset(&sigset,SIG2);//将第二个信号删除
}
}
}
}
main()
{
// 如果你想让进程死循环作第一件事
signal(SIG1,action);//SIG1是某一个信号,自己设
...
//如果你想让进程死循环作第二件事
signal(SIG2,action);//SIG2是某一个信号,自己设
}
今天刚看了几个信号函数,不知道这样对不对。如果错了不要取笑啊,我刚看了不到10分钟。:)
djfu
2006-08-11
打赏
举报
回复
在sig_usr1处理函数里面你要重置信号
void sig_usr1()
{
// ...
signal(SIGUSR1, sig_usr1);
}
void sig_usr1()
{
// ...
signal(SIGUSR2, sig_usr2);
}
loveisbug
2006-08-11
打赏
举报
回复
顶
upcuiling
2006-08-11
打赏
举报
回复
好像接收了第一个信号,第二个信号,再发第一个信号就接收不到了
upcuiling
2006-08-11
打赏
举报
回复
看了你的提示改把程序改成这样,但是,但我kill -USR2 PID (挂起进程),再执行kill -USR1 PID 还是唤不醒进程阿
int main(void)
{
signal(SIGUSR1,sig_usr1);
signal(SIGUSR2,sig_usr2);
sigset_t sigzero;
sigemptyset(&sigzero);
sigaddset(&sigzero,SIGUSR1);
sigaddset(&sigzero,SIGUSR2);
struct timespec ti;
for(;;)
{
ti.tv_nsec=10*1000; //暂停十秒
int wait=pselect(0,NULL,NULL,NULL,&ti,&sigzero);//等待信号到达
if(wait==-1){//发生错误
continue;
}
}
}
DanXer
2006-08-11
打赏
举报
回复
这是我的一段程序
sigset_t sigzero;
sigemptyset(&sigzero);
/*用下面的方法添加想要同步的信号,保持空集也可以*/
//sigaddset(&sigzero,SIGALRM);
struct timespec ti;
for(;;)
{//消息循环
/*
虽然linux系统现在还没有pselect系统调用,考虑移植性的问题,
我们还是需要pselect代替select.来避免非原子化的变量测试
产生的select的永远等待(现在可能还是会发生)
*/
ti.tv_nsec=10*1000; //暂停十秒
int wait=pselect(0,NULL,NULL,NULL,&ti,&sigzero);//等待信号到达
if(wait==-1){//发生错误
if(errno==EINTR)
{
SYNCLOGINFO(g_fp_infolog,"pselect被信号中断!");
}
else
{
SYNCLOGERROR(g_fp_errlog,"pselect错误,下一次轮询!",errno);
}
continue;
}
}
upcuiling
2006-08-11
打赏
举报
回复
对select使用不熟悉 ,能给个例子看看吗,谢谢
DanXer
2006-08-11
打赏
举报
回复
呵呵,在信号被发送的目标线程里pselect,这时它会停在那里,直到有信号进来pselect才会返回,如果你不想只是停在pselect里,你可以设置一个timeout值给pselect,就可以让它循环做一件事了。是信号还是超时,或是错误你可以通过返回值判断出来,其实select可以做同样的事,只不过,pselect和内核信号框架可以进行同步,保证在pselect调用和你的信号处理函数之间不会产生竞争。
upcuiling
2006-08-11
打赏
举报
回复
我用下面的代码来解决了,可是,当我发送SIGUSR2给进程,让他挂起后,再发SIGUSER1,让他继续写文件就没办法唤醒了,请教了
#include "apue.h"
static void sig_usr1(int);
static void sig_usr2(int);
static int sum;
static int i=0;
int main(void)
{
sum=0;
if(signal(SIGUSR1,sig_usr1)==SIG_ERR)
;
if(signal(SIGUSR2,sig_usr2)==SIG_ERR)
;
while(1)
;
pause();
}
static void sig_usr1(int singno)
{
int to_fd; //要写的目的文件符
int bytes_read=100; //要写的字节数
int bytes_write; //写进的字节数
char buffer[100]; //申请内存空间
char *ptr;
char writepath[40];
sprintf(writepath,"write_%d.txt",i);
ptr=buffer;
if((to_fd=open(writepath,O_WRONLY|O_CREAT|O_APPEND))==-1)
{
fprintf(stderr,"Open %s Error:%s\n",writepath,strerror(errno));
exit(1);
}
while(1)
{
while(bytes_write=write(to_fd,ptr,bytes_read))
{
/* 一个致命错误发生了 */
if((bytes_write==-1)&&(errno!=EINTR))break;
/* 写完了所有读的字节 */
else if(bytes_write==bytes_read) break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
}
}
static void sig_usr2(int singno)
{
//printf("usr2_sum is %d",sum);
i++;
pause();
}
发那科机器人IO信号的种类与常用信号的分配及
信号处理
本文将详细介绍发那科机器人IO信号的种类、常用信号的分配以及
信号处理
方法,并提供相应的源代码。本文介绍了发那科机器人IO信号的种类、常用信号的分配以及
信号处理
方法。模拟输入信号(AI):模拟输入信号用于接收连续变化的物理量,如电压、电流、压力等。数字输入信号(DI):数字输入信号用于接收来自外部设备的开关状态或逻辑信号。高速输出信号(HSO):高速输出信号用于产生高速脉冲信号,如脉冲方向控制、PWM输出等。高速输入信号(HSI):高速输入信号用于接收高速脉冲信号,如编码器脉冲、计数器输入等。
信号处理
--傅里叶变换的性质及常用信号的傅里叶变换
傅里叶变换的定义式 函数f(t)的傅里叶变换存在的充分条件是在无限区间内f(t)绝对可积,但它并非必要条件。 当引入广义函数的概念后,许多不满足绝对可积条件的函数也能进行傅里叶变换,这给信号与系统分析带来很大方便。 一、奇异函数的傅里叶变换 1、冲激函数的频谱 方法一:根据傅里叶变换的定义式,并且考虑到冲激函数的取样性质,得 其频谱密度在-∞<w<∞区间处处相等,常称为“均匀谱”或“白色频谱”。 方法二:应用广义极限的概念,单位冲激函数δ(t)是幅度为1/τ,脉宽为τ的矩形脉冲当τ→0的广
小波变换和motion
信号处理
(二)
这是《小波变换和motion
信号处理
》系列的第二篇,深入小波。第一篇我进行了基础知识的铺垫,第三篇主要讲解应用。在上一篇中讲到,每个小波变换都会有
一个
mother wavelet,我们称之为母小波,同时还有
一个
father wavelet,就是scaling function。而该小波的basis函数其实就是对这个母小波和父小波缩放和平移形成的。缩放倍数都是2的级数,平移的大小和当前其缩放的程度有...
Grbl外部中断:限位信号与
急
停按钮的硬件处理
在CNC(计算机数字控制)加工过程中,限位开关和
急
停按钮是保障设备安全运行的关键组件。你是否曾遇到过因限位开关误触发导致加工中断?或者因
急
停响应延迟造成设备损坏?本文将深入解析Grbl固件中外部中断系统的实现机制,重点探讨限位信号与
急
停按钮的硬件处理方案,帮助你构建更可靠的CNC控制系统。 读完本文,你将能够: - 理解Grbl中限位开关的中断处理原理 - 掌握外部中断的软件去抖实现方法 - 优...
急
停信号的含义
马工2017年硕士毕业,一直从事上位机软件开发工作,在我工作的第四年年薪突破了40万+,为了帮助跟我一样从底层出身的上位机软件工程师早日达到高级工程师的水平,早日找到30万+的工作,我根据多年项目经验,总结出了一系列可直接用于项目的C#上位机实战教程推荐给大家,目前在CSDN已经超过一千人订阅,如果你不甘贫庸,想像我一样早日拿到高薪,马工强烈推荐你早日学这套教程,雷军曾说这个世界上有99%的
问题
别人都遇到过,你要做的不是闷头干!而是找这个领域的专家问一下,这是最快速提升自己的方法!
Linux/Unix社区
23,223
社区成员
74,537
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章