当前位置:  技术问答>linux和unix

还是有一个信号的问题等待求助

    来源: 互联网  发布时间:2015-07-28

    本文导语:  我的主进程先signal(SIGCHLD,sigfunc), 然后开始 while(1) {    accept(……)    if(!fork())    {        childfunc(newsocket);       ……//子进程    } } sigfunc()里面 {     signal(SIGCHLD,sigfunc...

我的主进程先signal(SIGCHLD,sigfunc),
然后开始
while(1)

   accept(……)
   if(!fork())
   { 
      childfunc(newsocket);
      ……//子进程
   }


sigfunc()里面

    signal(SIGCHLD,sigfunc);
    if(waitpid(0,NULL,WNOHANG)>0)
          count--;



子进程我只是sleep(n);
可是结果是我的子进程怎么都显示退不出来。。。。。。

请问这是什么原因?
问题很急,请求高手能否指点一下?谢谢

|
消息处理函数写的不对
应该是在程序的某个地方使用signal(SIGCHLD,sigfunc);的时候
消息处理机制才会根据sigfunc函数明来调用sigfunc()来处理消息
你的消息处理函数本身调用了自己,有点像递规了,不知道这样行不行.
这是个简单的例子,你看看消息处理函数是怎么用的
#include
#include

static void par_sig(int signo);
static void c1_sig(int signo);
static void c2_sig(int signo);

static long p_realt_secs=0,c1_realt_secs=0,c2_realt_secs=0;
static long p_virtt_secs=0,c1_virtt_secs=0,c2_virtt_secs=0;
static long p_proft_secs=0,c1_proft_secs=0,c2_proft_secs=0;

static struct itimerval p_realt,c1_realt,c2_realt;
static struct itimerval p_virtt,c1_virtt,c2_virtt;
static struct itimerval p_proft,c1_proft,c2_proft;

long unsigned fibonacci(unsigned int n);

static void par_sig(int signo)
{
switch(signo)
{
case SIGALRM:
p_realt_secs+=10;
break;
case SIGVTALRM:
p_virtt_secs+=10;
break;
case SIGPROF:
p_proft_secs+=10;
break;
}
}

static void c1_sig(int signo)
{
switch(signo)
{
case SIGALRM:
c1_realt_secs+=10;
break;
case SIGVTALRM:
c1_virtt_secs+=10;
break;
case SIGPROF:
c1_proft_secs+=10;
break;
}
}

static void c2_sig(int signo)
{
switch(signo)
{
case SIGALRM:
c2_realt_secs+=10;
break;
case SIGVTALRM:
c2_virtt_secs+=10;
break;
case SIGPROF:
c2_proft_secs+=10;
break;
}
}

long unsigned fibonacci(unsigned int n)
{
if(n==0)
return 0;
else if(n==1||n==2)
return 1;
else
return (fibonacci(n-1)+fibonacci(n-2));
}
int main()
{
long unsigned fib=0;
int pid1,pid2;
unsigned int fibarg=39;
int status;
struct itimerval v;
long moresec,moremsec,t1,t2;

pid1=fork();
if(pid1==0)
{
signal(SIGALRM,c1_sig);
signal(SIGVTALRM,c1_sig);
signal(SIGPROF,c1_sig);
v.it_interval.tv_sec=10;
v.it_interval.tv_usec=0;
v.it_value.tv_sec=10;
v.it_value.tv_usec=0;
setitimer(ITIMER_REAL,&v,NULL);
setitimer(ITIMER_VIRTUAL,&v,NULL);
setitimer(ITIMER_PROF,&v,NULL);
fib=fibonacci(fibarg);

getitimer(ITIMER_PROF,&c1_proft);
getitimer(ITIMER_REAL,&c1_realt);
getitimer(ITIMER_VIRTUAL,&c1_virtt);

moresec=9-c1_realt.it_value.tv_sec;
moremsec=(1000000-c1_realt.it_value.tv_usec)/1000;
printf("Child 1 fib=%ld,real time=%ld sec,%ld msecn",fib,c1_realt_secs+moresec,moremsec);
moresec=9-c1_proft.it_value.tv_sec;
moremsec=(1000000-c1_proft.it_value.tv_usec)/1000;
printf("Child 1 fib=%ld,cpu time=%ld sec,%ld msecn",fib,c1_proft_secs+moresec,moremsec);
moresec=9-c1_virtt.it_value.tv_sec;
moremsec=(1000000-c1_virtt.it_value.tv_usec)/1000;
printf("Child 1 fib=%ld,user time=%ld sec,%ld msecn",fib,c1_virtt_secs+moresec,moremsec);
t1=(9-c1_proft.it_value.tv_sec)*1000+(1000000-c1_proft.it_value.tv_usec)/1000+c1_proft_secs*10000;
t2=(9-c1_virtt.it_value.tv_sec)*1000+(1000000-c1_virtt.it_value.tv_usec)/1000+c1_virtt_secs*10000;
moresec=(t1-t2)/1000;
moremsec=(t1-t2)%1000;
printf("Child 1 fib=%ld,kernel time=%ld sec,%ld msecn",fib,moresec,moremsec);
fflush(stdout);
exit(0);
}
else
{
pid2=fork();
if(pid2==0)
{
signal(SIGALRM,c2_sig);
signal(SIGVTALRM,c2_sig);
signal(SIGPROF,c2_sig);
v.it_interval.tv_sec=10;
v.it_interval.tv_usec=0;
v.it_value.tv_sec=10;
v.it_value.tv_usec=0;
setitimer(ITIMER_REAL,&v,NULL);
setitimer(ITIMER_VIRTUAL,&v,NULL);
setitimer(ITIMER_PROF,&v,NULL);
fib=fibonacci(fibarg);

getitimer(ITIMER_PROF,&c2_proft);
getitimer(ITIMER_REAL,&c2_realt);
getitimer(ITIMER_VIRTUAL,&c2_virtt);

moresec=9-c2_realt.it_value.tv_sec;
moremsec=(1000000-c2_realt.it_value.tv_usec)/1000;
printf("Child 2 fib=%ld,real time=%ld sec,%ld msecn",fib,c2_realt_secs+moresec,moremsec);
moresec=9-c2_proft.it_value.tv_sec;
moremsec=(1000000-c2_proft.it_value.tv_usec)/1000;
printf("Child 2 fib=%ld,cpu time=%ld sec,%ld msecn",fib,c2_proft_secs+moresec,moremsec);
moresec=9-c2_virtt.it_value.tv_sec;
moremsec=(1000000-c2_virtt.it_value.tv_usec)/1000;
printf("Child 2 fib=%ld,user time=%ld sec,%ld msecn",fib,c2_virtt_secs+moresec,moremsec);
t1=(9-c2_proft.it_value.tv_sec)*1000+(1000000-c2_proft.it_value.tv_usec)/1000+c2_proft_secs*10000;
t2=(9-c2_virtt.it_value.tv_sec)*1000+(1000000-c2_virtt.it_value.tv_usec)/1000+c2_virtt_secs*10000;
moresec=(t1-t2)/1000;
moremsec=(t1-t2)%1000;
printf("Child 2 fib=%ld,kernal time=%ld sec,%ld msecn",fib,moresec,moremsec);
fflush(stdout);
exit(0);
}
else
{
signal(SIGALRM,par_sig);
signal(SIGVTALRM,par_sig);
signal(SIGPROF,par_sig);
v.it_interval.tv_sec=10;
v.it_interval.tv_usec=0;
v.it_value.tv_sec=10;
v.it_value.tv_usec=0;
setitimer(ITIMER_REAL,&v,NULL);
setitimer(ITIMER_VIRTUAL,&v,NULL);
setitimer(ITIMER_PROF,&v,NULL);
fib=fibonacci(fibarg);

getitimer(ITIMER_PROF,&p_proft);
getitimer(ITIMER_REAL,&p_realt);
getitimer(ITIMER_VIRTUAL,&p_virtt);

moresec=9-p_realt.it_value.tv_sec;
moremsec=(1000000-p_realt.it_value.tv_usec)/1000;
printf("Parent fib=%ld,real time=%ld sec,%ld msecn",fib,p_realt_secs+moresec,moremsec);
moresec=9-p_proft.it_value.tv_sec;
moremsec=(1000000-p_proft.it_value.tv_usec)/1000;
printf("Parent fib=%ld,cpu time=%ld sec,%ld msecn",fib,p_proft_secs+moresec,moremsec);
moresec=9-p_virtt.it_value.tv_sec;
moremsec=(1000000-p_virtt.it_value.tv_usec)/1000;
printf("Parent fib=%ld,user time=%ld sec,%ld msecn",fib,p_virtt_secs+moresec,moremsec);
t1=(9-p_proft.it_value.tv_sec)*1000+(1000000-p_proft.it_value.tv_usec)/1000+p_proft_secs*10000;
t2=(9-p_virtt.it_value.tv_sec)*1000+(1000000-p_virtt.it_value.tv_usec)/1000+p_virtt_secs*10000;
moresec=(t1-t2)/1000;
moremsec=(t1-t2)%1000;
printf("Parent fib=%ld,kernel time=%ld sec,%ld msecn",fib,moresec,moremsec);
fflush(stdout);
waitpid(0,&status,0);
waitpid(0,&status,0);
exit(0);
}
printf("This line should never be printedn");
}
}

这是个使用定时器的例子,看看消息处理函数是怎么用的

|
你的sigfunc()里面还有,signal(SIGCHLD,sigfunc);
signal的第二个参数是你写的消息处理函数的名字,你的消息处理函数本身似乎不能再调用自己吧

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 还是关于QT 的问题(求助)
  • 高分求助 TENDA TEI6618,TEI6690 用的哪一款ARM,或者还是其他CPU
  • to:chenyuan_tongji,求助,还是没有成功
  • 【求助】已经安装了libstdc++.so.5 还是报错“libstdc++.so.5 is needed by”
  • 求助:已经安装了共享库,还是提示“Unable to load library”
  • 世界上最愚蠢的问题啦!!还是不会。求助
  • 求助:gdb调试core文件,加了-g参数,还是显示no debugging symbols found
  • wls6.1+jb5做了一个SessionBean,我知问题出在Temp路径的空格上,我已改了,但还是出错。我在enterprise Setup中把Use external compiler去掉又可以,但这样不能更新Jar.求助!!
  • 程序员为了健康必看!早晨空腹喝水,是对还是错?
  • jsp+bean还是jsp+ejb还是jsp+servlet还是asp+activex好?
  • 还是那个关于update的问题呀,还是解决不了呀?
  • http走的是tcp还是udp?ssh是tcp还是udp?
  • 请问ResultSet返回的是全部数据,还是指针,还是其他什么?
  • 怎样在服务器端判断客户使用的浏览器是使用的简体中文的还是英文的还是日文的或者其他的?
  • 大家以后的发展方向是什么?能交流一下么?是就想学好专业知识,打一辈子工?还是自己开公司?还是要考研究生,使自己提高一个档次?还是想办法出国深造?发言比有分!!!
  • 程序里如何判断光驱里的是DVD盘,还是CD盘,还是一般的CD数据盘
  • linux新手想请问大家你们在linux下通常用什么开发语言和工具(C多点还是C++多点还是pascal ?还有工具方面?)
  • 你的桌面用的是LINUX还是UNIX还是WINDOWS?
  • 请问EJB高手,EJB主要用在b/s方式还是c/s,还是两这都可?有用过jBoss的吗?有配置文档吗?一定给分!!
  • linux下的c/c++语言开发,最好的ide是gcc还是kylix还是其他
  • jsp程序运行一次后,再修改原jsp程序,为什么运行还是的还是原来的程序??
  • 学习JAVA用JSDK开发还是VJ++?有什么区别吗?还是一样?
  • 我以前是搞DELPHI的,现在想学JAVA,请教各位大侠你们用的都是什么开发环境是JBuild,还是VJ++,还是其他的(参与者都有分)
  • 求教:LIUNX 学开发还是学主机维护。。??
  • 新手问题,在linux下c/c++开发是在图形界面下还是字符界面下进行?
  • 【求助】已经安装了libstdc++.so.5 还是报错“libstdc++.so.5 is needed by” iis7站长之家
  • REDHAT8.0还是REDHAT9.0?
  • linux下的编程主旨思想是在面向过程还是面向对象的?谢谢!!
  • 诸位写驱动是先找一个类似的程序更改还是从头些?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3