主题:一个简单的发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;
}
}
子进程每秒钟给父进程发送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;
}
}