回 帖 发 新 帖 刷新版面

主题:一个简单的发SIGUSR1,SIGUSR2信号的程序请大家指错

程序很简单,
   子进程每秒钟给父进程发送SIGUSR1信号,父进程收到后打印系统当前时间,我的这个程序不知道为什么第一个信号就阻塞在tim=localtime(&nowtime); 这句上,后面的信号都没法处理,不知道为什么会这样 

   请高人指教啊!!!

#include <time.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>
#include <stdlib.h>
void my_sighandler(int signum)

    time_t nowtime=0;
    struct tm *tim;
    if(signum==SIGUSR1)
    {     
        if(time(&nowtime)==-1)
             perror("time");
        tim=localtime(&nowtime); // ------------------总是阻塞在这里
        printf("%d-%d-%d,%d:%d:%d\n",tim->tm_mon,
                                   tim->tm_mday,
                                   tim->tm_year+1900,//transform 106 to 2006
                                   tim->tm_hour,
                                   tim->tm_min,
                                   tim->tm_sec);
    }
  
    else if(signum==SIGUSR2)
    {
        printf("quit!\n");
        exit(0);  
    }
}
int main()
{
   printf("parent id:%d\n",getpid());
   int pid,k,stat;
   struct sigaction user_action;
   sigset_t block_mask;
   sigfillset(&block_mask);
   user_action.sa_handler=my_sighandler;
   user_action.sa_mask=block_mask;
   user_action.sa_flags=0;
   sigaction(SIGUSR1,&user_action,NULL);
   sigaction(SIGUSR2,&user_action,NULL);
   pid=fork();
   int i=0;
   if(pid<0)
   {
     printf("fork error!\n");
     exit(1);
   }
   else if(pid==0)//子进程每隔一秒向父进程发送一个SIGUSR1
   {
      printf("child pid:%d\n",getpid());
      for(i=0;i<10;i++) 
      {
                          //-----------------sleep(1)如果放到这里就不会阻塞 
        if((k= kill(getppid(),SIGUSR1))==-1)
        {
           perror("kill");
           exit(1);
        }
        sleep(1);   
      }
      kill(getppid(),SIGUSR2);
   }
   if(pid>0)
   { 
     while (1)
    {
      pause();
    }
    return 0;
   }

}

回复列表 (共1个回复)

沙发

#include <time.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>
#include <stdlib.h>
void my_sighandler(int signum)

    time_t nowtime=0;
    struct tm *tim;
    if(signum==SIGUSR1)
    {     
        if(time(&nowtime)==-1)
             perror("time");
        tim=localtime(&nowtime); // ------------------总是阻塞在这里
                               
        printf("%d-%d-%d,%d:%d:%d\n",tim->tm_mon,
                                   tim->tm_mday,
                                   tim->tm_year+1900,//transform 106 to 2006
                                   tim->tm_hour,
                                   tim->tm_min,
                                   tim->tm_sec);
    }
  
    else if(signum==SIGUSR2)
    {
        printf("quit!\n");
        exit(0);  
    }
}
int main()
{
   printf("parent id:%d\n",getpid());
   int pid,k,stat;
   struct sigaction user_action;
   sigset_t block_mask;

    sigset_t mask;
    sigset_t omask;
     sigemptyset(&mask);
    sigaddset(&mask,SIGUSR1);
    sigprocmask(SIG_BLOCK,&mask,&omask);



   sigfillset(&block_mask);
   user_action.sa_handler=my_sighandler;
   user_action.sa_mask=block_mask;
   user_action.sa_flags=0;
   sigaction(SIGUSR1,&user_action,NULL);
   sigaction(SIGUSR2,&user_action,NULL);
   pid=fork();
   int i=0;
   if(pid<0)
   {
     printf("fork error!\n");
     exit(1);
   }
   else if(pid==0)//子进程每隔一秒向父进程发送一个SIGUSR1
   {
      printf("child pid:%d\n",getpid());
      for(i=0;i<10;i++) 
      {
                          //-----------------sleep(1)如果放到这里就不会阻塞 
        if((k= kill(getppid(),SIGUSR1))==-1)
        {
           perror("kill");
           exit(1);
        }
        sleep(1);   
      }
      kill(getppid(),SIGUSR2);
   }
   if(pid>0)
   { 
     while (1)
    {
       //pause();


    sigsuspend(&omask);   
     


    }
    return 0;
   }

}

我来回复

您尚未登录,请登录后再回复。点此登录或注册