免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: u5
打印 上一主题 下一主题

请教:怎样使用signal [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-05-22 13:02 |只看该作者

请教:怎样使用signal

UNIX程序设计教程
第8章信号处理中有,在P287页

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
12 [报告]
发表于 2003-05-22 13:04 |只看该作者

请教:怎样使用signal

怎样使用signal进行进程之间的信号传递,比如一个子进程有错,发信号给父进程,父进程再创建另一子进程?

信号是一种方法。包括无双兄所说的。这种方法主要表现为:

1、可以在对接受到SIGCHLD(如果调用wait或者waitpid),和接受到其它自定义信号的情况下(子进程异常退出不能处理)。

2、自己定义一个数据结构,如果是在父子进程比较简单,通过流管道来做,让子进程把自己的状态信息通过这个数据结构告诉父进程。复进程通过对该结构的状态监测结果决定是否重启。

论坛徽章:
0
13 [报告]
发表于 2003-05-22 13:15 |只看该作者

请教:怎样使用signal

我想了一个方法就是使用全局变量,在处理了死掉的子进程后设置全局变量值,父进程适应循环监测全局变量如果发现全局变量的值改变则创建子进程
,可是这不是一个好的方法,还有其他的方法能够进行这种方式吗?最好能够有一个例子

论坛徽章:
0
14 [报告]
发表于 2003-05-22 13:47 |只看该作者

请教:怎样使用signal

我写了这样一个程序发现kill掉一个子进程后父进程就不断的执行重新创建新的子进程如下代码
#include  <signo.h>;
void testchild(signo)
int signo;
{
  printf("the child is killed \n";
  wait();
}
main()
{
  int iLoop;
  struct sigaction act;
  int isig;
  int iforkval;
  act.sa_flags=SA_SIGINFO;
  act.sa_sigaction=(void *) testchild;
  isig=SIGCHLD;
  for (iLoop=0;iLoop<10;iLoop++);
{
  iforkval=fork();
  if (iforkval==0)
  {  break;}
}
if (iforkval!=0)
{
  printf("pid=%d,this is parent\n",getpid());
sleep(1);
if (sigaction(isig,&act,NULL)>;=0)
{
  iforkval=fork();
  if (iforkval==0)
{printf("crate the fork\n";    // (1)
  break;
}
}
}}
if (iforkval==0)
{
  while(1)
  {
    printf("pid=%d,this is child\n",getpid());
   sleep(10);
  }
}
}
使用kill 命令kill掉一个子进程 后父进程不断的执行 (1)出的语句,创建很多的子进程,请问这时为什么

论坛徽章:
0
15 [报告]
发表于 2003-05-22 13:53 |只看该作者

请教:怎样使用signal

设置全局变量的方式我试过,很简单但确实不是一个好方法
版主说得第一种方法自定义信号我也试过,我想学学第二种方法:

自己定义一个数据结构,如果是在父子进程比较简单,通过流管道来做,让子进程把自己的状态信息通过这个数据结构告诉父进程。复进程通过对该结构的状态监测结果决定是否重启。

有没有在多子进程的程序中怎么用管道?开一个管道公用呢还是开N个?这方面比较专业我还没接触过,可能问的问题也有些白,还请海涵!有没有这方面的程序让我瞅瞅学习学习?谢谢了

论坛徽章:
0
16 [报告]
发表于 2003-05-22 14:49 |只看该作者

请教:怎样使用signal

u5 :你好能不能吧你的这段程序的中的 sigaction(SIGUSR1,&usr_action,NULL);  和      if(signo==SIGUSR1)
的功能用法帮我解释一下谢谢


struct sigaction usr_action;
      sigset_t block_mask;
      /*初始化信号句柄*/
      sigfillset(&block_mask);
      usr_action.sa_handler=sig_usr;/*指定与信号相关连的动作*/
      usr_action.sa_mask=block_mask;
      usr_action.sa_flags=0;
      /*为信号SIGUSR1和SIGUSR2指定动作*/
      sigaction(SIGUSR1,&usr_action,NULL);
      sigaction(SIGUSR2,&usr_action,NULL);

      if(signo==SIGUSR1)
        { /*printf("received SIGUSR1 \n";*/
           /*创建新的子进程*/
                  }
      else if(signo==SIGUSR2)
         {  /*printf("received SIGUSR2";*/
            /*创建新的子进程5*/
           }

论坛徽章:
0
17 [报告]
发表于 2003-05-22 16:14 |只看该作者

请教:怎样使用signal

自己定义一个数据结构,是不是需要使用共享内存这样可以将定义的数据结果和共享内存结合起来

论坛徽章:
0
18 [报告]
发表于 2003-05-22 19:51 |只看该作者

请教:怎样使用signal

  1. void sig_usr(int signo)/*信号SIGUSR1,SIGUSR2的句柄*/
  2. {   
  3.      pid_t child_id4,child_id5;
  4.      if(signo==SIGUSR1)
  5.         { /*printf("received SIGUSR1 \n");*/
  6.            /*创建新的子进程4*/
  7.            child_id4=fork();
  8.            if(child_id4==0)
  9.               { child_function4();
  10.                  }           
  11.            else if(child_id4<0)
  12.                printf("fork error.");
  13.         }
  14.       else if(signo==SIGUSR2)
  15.          {  /*printf("received SIGUSR2");*/
  16.             /*创建新的子进程5*/
  17.             child_id5=fork();
  18.             if(child_id5==0)
  19.                 { child_function5();
  20.                      }                        
  21.             else if(child_id5<0)
  22.                 printf("fork error.");
  23.          }   
  24. }
复制代码
说明信号到达后父进程的动作,也就是信号的句柄了,我用了if(signo==SIGUSR1)和if(signo==SIGUSR2)是为了判断是信号1还是信号2

论坛徽章:
0
19 [报告]
发表于 2003-05-23 08:55 |只看该作者

请教:怎样使用signal

谢谢,我明白了。其实sigaction是代替signal 的函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP