pause()函数的一个问题。。。

来源:百度文库 编辑:神马文学网 时间:2024/04/28 11:36:11

您查询的关键词是:linux sigrtmin sigaction  。如果打开速度慢,可以尝试快速版;如果想保存快照,可以添加到搜藏。

(百度和网页http://tieba.baidu.com/f?kz=502259850的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。)


div,td{font-family: 宋体;}a:link {color:#261cdc;text-decoration: underline}a:visited {color: #261cdc; text-decoration: underline}/*td {font-size: 75%; line-height: 150%}*/td{font-size:12px; line-height:18px;}.p14{font-size:14px;}.gray{color:#0033cc;}.gray12{color:#666666;}.gray14{font-size:14px;}.gray14 a:link{color:#261cdc;}.gray14 a:hover{color:#261cdc;}.gray14 a:visited{color:#800080;}a.n:link{color:#FFFFFF;}a.n:link{color:#FFFFFF;}a.n:hover{color:#FFFFFF;}a.n:visited{color:#FFFFFF;}.t {COLOR: #261cdc;TEXT-DECORATION: none}.v {COLOR: #261cdc;TEXT-DECORATION: none;font-size:12px;}.fB{ font-weight:bold;}.htb{margin-bottom:5px;font-family:arial}.htb td{font-family:arial}.pad10L{padding-left:10px; }.g{color:#666666}.bt{ background-color:#FCE6CD;clear:both ; height:60px; border:0; width:100%; margin:0; padding:0}.i{font-size:16px; font-family:arial}.Tit1{height:21px; font-size:14px; font-family:arial}a.top{font-family:arial}a.top:link {COLOR: #0000cc; text-decoration: underline}a.top:visited {COLOR: #800080; text-decoration: underline}a.top:active {COLOR: #0000cc; text-decoration: underline}.c{color:#7777CC;}a.c{color:#7777CC;}a.c:visited{color:#7777CC;}.ntb{width:100%;background-color:#0000cc;height:20px;line-height:20px;}.pg{font-family:arial;word-spacing:4px;}.pg *{font-family:arial;}.pg font{font-size:12px;}/*以下为页首样式*/body,form{margin:0}.usrbar{margin-top:4px;padding-right:10px;font-size:12px;height:19px;line-height:19px;font-family:Arial;text-align:right}.hdch{margin-top:3px;height:21px;font-size:14px;font-family:arial}div.cpro_post {border:0px;padding:5px 0px 5px 0px ;margin-bottom:12px}div.cpro_post div{overflow:hidden;word-break:break-all}div.cpro_post div a{font-size:12px;color:black;text-decoration:none}div.cpro_post div a:visited{font-size:12px;color:black;text-decoration:none}div.cpro_post div a u{font-size:14px;color:blue;text_decoration:underline}div.cpro_post div a span{font-size:12px;color:green}div.cpro_post div a span.cpro_red{color:#c60a00;font-size:12px;}div.cpro_post div a u span.cpro_red{font-size:14px;}#cproshow{word-break:break-all;width:210px;margin:0;padding:0;}.wr{;word-wrap:break-word;width:87%;}.au div{float:left; line-height:24px; height:24px;}.au .shi{height:16px; padding-top:2px !important; padding-top:6px;}.au .auw{ width:95px;}.au .uau{padding-top:2px;}#yzm input{ime-mode:disabled;}关于pause()函数的一个问题。。。
新闻   网页   贴吧   知道   MP3   图片   视频   百科     吧内搜索 | 帮助
 百度贴吧 > linux吧 > 浏览贴子 吧主:十年磨e剑 ghosTM55 linux吧    添加到搜藏 | 快速回复 贴吧投诉  直通岗位的数字通信软件工程..
乐成数字通信学院,真正直通企业岗位的"数字通信软件开发工程师"国..
www.ldci.com.cn
北大青鸟软件工程师培训
北大青鸟精品校区软件工程师培训班.想进入IT界并不困难-学习编程最..
www.bjaccp.com
华育国际 IT职业教育专家 软..
华育国际网络工程师,软件工程师,动画设计师培训,全国咨询热线:400-..
www.eduask.cn
java软件工程师培训
东方标准Java高级软件工程师培训:精深的核心技术讲解,三大全真企业..
bj.oristand.com
中嵌学院 500名学员高质量就..
嵌入式Linux培训 中嵌学院(中嵌教育)保证100%就业,500名学员就业案..
www.chinaeda.cn
北大青鸟linux培训, 专业成..
北大青鸟linux培训,由专业老师授课,保证课程内容的统一性,特有的沟..
www.edu-bdqn.net
1 关于pause()函数的一个问题。。。 《UNIX环境高级编程v2》的p252上说“pause函数使调用进程挂起直到捕捉到一个信号。只有执行了一个信号处理程序并从其返回时,pause才返回”,我觉得调用进程捕捉到一个信号并执行完信号处理函

数后就应该从pause函数返回,并接着执行pause的下一条语句,但是在实验中却出现了一个问题,以下是源码和执行结果:
#include 
#include 
#include 
#include 
#include 

#define sig0 SIGRTMIN

void mythread();
void my_op(int,siginfo_t*,void*);

int main()
{
        pthread_t tid;
        sigset_t sigset;
        struct sigaction act;
        int i,ret;

        if(pthread_create(&tid,NULL,(void *)mythread,NULL)!=0)
        {
                printf("pthread_create error\n");
                exit(1);
        }
        sigemptyset(&sigset);
        sigemptyset(&act.sa_mask);
        act.sa_sigaction=my_op;
        act.sa_flags=SA_SIGINFO;
        ret=sigaction(sig0,&act,NULL);
        if(ret<0)
                printf("install signal error\n");
        for(i=0;i<5;i++)
        {
                pause();
                printf("pause has awaked!\n");
        }
        return 0;
}

void mythread()
{
        int i;
        union sigval mysigval;

        for(i=0;i<5;i++)
        {
                sleep(2);
                mysigval.sival_int=i;
                sigqueue(getpid(),sig0,mysigval);
        }
}
void my_op(int signum,siginfo_t *info,void *myact)
{
        int val;
        printf("my_op begin\n");
        val=(*info).si_int;
        printf("val=%d\n",val);
        //getmsg=OSQPend(MsgQueue,perr);
        printf("my_op end\n");
}
执行结果为:
my_op begin
val=0
my_op end
my_op begin
val=1
my_op end
my_op begin
val=2
my_op end
my_op begin
val=3
my_op end
my_op begin
val=4
my_op end
pause has awaked!
从运行结果看,主线程捕捉到一个信号并执行了相应的my_op后并没有从pause函数返回,而是在子线程发送完5个信号后才执行了pause后面的printf语句,这是什么原因呢?
作者: 125.71.200.*   2008-11-15 21:59   回复此发言  
2 回复:关于pause()函数的一个问题。。。 理由很简单,unix的信号是不排队的。你可以试着发送不同的信号来测试。
-猜测。哈哈
作者: 零家捣蛋精灵    2008-11-15 22:21   回复此发言  
3 回复:关于pause()函数的一个问题。。。 上面的猜测错了。我对你的代码进行了测试,基本上可以确定就是sigqueue(getpid(),sig0,mysigval);的问题。你可以换一下信号 为SIGALRM,然后修改sigqueue(getpid(),sig0,mysigval);为alarm(2);就没问题了。线程我不熟悉,感觉最后主线程收到的信号不是你指定发送的信号。 作者: 零家捣蛋精灵    2008-11-15 22:59   回复此发言  
4 回复:关于pause()函数的一个问题。。。 pause的解释没有错,你的测试错了。我的猜测也错了。完整的代码:
#include 
#include 
#include 
#include 
#include 

#define sig0 SIGRTMIN -----修改为SIGALRM

void mythread();
void my_op(int,siginfo_t*,void*);

int main()
{
 pthread_t tid;
 sigset_t sigset;
 struct sigaction act;
 int i,ret;

 if(pthread_create(&tid,NULL,(void *)mythread,NULL)!=0)
 {
 printf("pthread_create error\n");
 exit(1);
 }
 sigemptyset(&sigset);
 sigemptyset(&act.sa_mask);
 act.sa_sigaction=my_op;
 act.sa_flags=SA_SIGINFO;
 ret=sigaction(sig0,&act,NULL);
 if(ret<0)
 printf("install signal error\n");
 for(i=0;i<5;i++)
 {
 pause();
 printf("pause has awaked!\n");
 }
 return 0;
}

void mythread()
{
 int i;
 union sigval mysigval;

 for(i=0;i<5;i++)
 {
 sleep(2);
 mysigval.sival_int=i;
 // sigqueue(getpid(),sig0,mysigval);--注释掉
 alarm(1);
 }
}
void my_op(int signum,siginfo_t *info,void *myact)
{
 int val;
 printf("my_op begin\n");
 val=(*info).si_int;
 printf("val=%d\n",val);
 //getmsg=OSQPend(MsgQueue,perr);
 printf("my_op end\n");
}
执行结果为: 
my_op begin
val=13140866
my_op end
pause has awaked!
my_op begin
val=13140866
my_op end
pause has awaked!
my_op begin
val=13140866
my_op end
pause has awaked!
my_op begin
val=13140866
my_op end
pause has awaked!
my_op begin
val=13140866
my_op end
pause has awaked!
作者: 零家捣蛋精灵    2008-11-15 23:09   回复此发言  
5 回复4:关于pause()函数的一个问题。。。 多谢楼上的,但是如果用alarm的话就只能以固定的时间间隔发出信号且不能随信号发送一定量的信息。如果信号的发送不是固定的,而是随机的怎么办? 作者: 125.71.200.*   2008-11-16 11:25   回复此发言  
6 回复:关于pause()函数的一个问题。。。 如果你要测试pause的使用的话,你的例子麻烦了些,如果你要解决随信号发送信息的话,我觉得如果在进程间实现最好用ipc消息队列或者共享内存,在线程间传送则更简单,只要你解决好同步的问题,定义个简单的全局变量都可以实现信息共享。 作者: 零家捣蛋精灵    2008-11-16 16:01   回复此发言  
7 回复:关于pause()函数的一个问题。。。 我写了2个简单的例子你比较一下看看pause处理的差别:
1、这个可以完美的实现你的要求
//
#include"/usr/workarea/cprogram/include/clsscr.h"
void sig_act();

int main(int argc,char **argv)
{
 int i,j,k;
 pid_t pid;
 signal(SIGCHLD,SIG_IGN);
 signal(SIGUSR1,sig_act);
 for(i=0;i<5;i++)
 {
 pid=fork();
 if(pid<0)
 return 0;
 if(pid==0)
 {
 sleep(2);
 kill(getppid(),SIGUSR1);
 sleep(1);
 exit(0);
 }
 if(pid>0)
 {
 pause();
 printf("sdlf\n");
 }
 }
 return 0;
}
void sig_act()
{
 printf("sig_act\n");
}
2、这个就出现你的那段代码呈现的问题:
//
#include"/usr/workarea/cprogram/include/clsscr.h"
void sig_act();

int main(int argc,char **argv)
{
 int i,j,k;
 pid_t pid;
 signal(SIGCHLD,SIG_IGN);
 signal(SIGUSR1,sig_act);
 for(i=0;i<5;i++)
 {
 pid=fork();
 if(pid<0)
 return 0;
 if(pid==0)
 {
 sleep(2);
 kill(getppid(),SIGUSR1);
 sleep(1);
 exit(0);
 }
 if(pid>0)
 {
 continue;
 }
 }
 for(i=0;i<5;i++)
 {
 pause();
 printf("sdfl\n");
 }
 return 0;
}
void sig_act()
{
 printf("sig_act\n");
}
作者: 零家捣蛋精灵    2008-11-16 16:23   回复此发言  
共有贴子数7篇   
标 题: 内 容: 图片/视频链接: (如何贴图/贴视频?) 用户名:       

#ft{clear:both;line-height:20px;background:#E6E6E6;text-align:center}#ft,#ft *{color:#77C;font-size:12px;font-family:Arial;white-space:nowrap}©2008 Baidu 贴吧协议