Код функции процессора сигналов:
void
timer_sig_handler(int sig){
db_manager_st * dms_p;
fs_pipe_ipc_st ipc_data;
int db_rname_l,db_prex_l;
db_name_t temp_db_name;
ipc_data.event_type=FS_TEST;
dms_p=dms;
db_prex_l=strlen(DB_PREX);
ftruncate(db_nm_fd,0);
lseek(db_nm_fd,0,SEEK_SET);
printf("[check dms]:\n");
while(dms_p!=NULL){
printf("\tdb:%s-> \n",dms_p->db_name);
memset(temp_db_name,0,sizeof(db_name_t));
strcpy(temp_db_name,dms_p->db_name+db_prex_l);
db_rname_l=strlen(temp_db_name);
printf("%s\n",temp_db_name);
temp_db_name[db_rname_l]='\n';
write(db_nm_fd,temp_db_name,db_rname_l+1);
if(dms_p->isOpenned==TRUE)
if(write(dms_p->pipe_fd[1],&ipc_data,sizeof(fs_pipe_ipc_st))==-1 && errno==EPIPE){
dms_p->isOpenned=FALSE;
close(dms_p->pipe_fd[1]);
cur_pro_num--;
printf("\t\t%s closed\n",dms_p->db_name);
}
dms_p=dms_p->db_manager_next;
}
}
Создание кода таймера:
int
create_timer(int timer_interval,void (*timer_sig_handler)(int)){
timer_t timerid;
struct sigevent evp;
struct itimerspec ts;
struct sigaction sa;
sa.sa_handler=timer_sig_handler;
sigemptyset(&sa.sa_mask);
if(sigaction(SIGUSR1,&sa,NULL)==-1)
return -1;
evp.sigev_notify=SIGEV_SIGNAL;
evp.sigev_signo=SIGUSR1;
if(timer_create(CLOCK_REALTIME,&evp,&timerid)==-1)
return -1;
ts.it_interval.tv_sec=timer_interval;
ts.it_interval.tv_nsec=0;
ts.it_value.tv_sec=timer_interval;
ts.it_value.tv_nsec=0;
if(timer_settime(timerid,0,&ts,NULL)==-1)
return -1;
return 0;
}
Я написал таймер POSIX периодически посылать сигнал SIGUSR1 и регистрировать функцию процессора, но иногда программа была напрямую прервана сигналом: я хочу создать таймер для решения некоторых задач. Я использую таймер POSIX для отправки сигнала SIGUSR1 для информирования программы и регистрации связанной функции процессора сигналов, но иногда программа будет напрямую уничтожена поведением этого сигнала по умолчанию, как если бы функция процессора не выполнялась, что вызывает беспокойство.
Иногда нормально:
[baba@localhost mydbs]$ ./db_main
read db.config……
read db.record......
Waiting for connection,port:9999
[check dms]:
db:db_test5->
test5
db:db_test4->
test4
[check dms]:
db:db_test5->
test5
db:db_test4->
test4
[check dms]:
db:db_test5->
test5
db:db_test4->
test4
^C
Прекращено:
[baba@localhost mydbs]$ ./db_main
read db.config……
read db.record......
Waiting for connection,port:9999
[check dms]:
db:db_test4->
test4
db:db_test5->
test5
User defined signal 1
[baba@localhost mydbs]$
В соответствии с В соответствии с этим функция процессора сигналов будет выполняться по меньшей мере один раз, но последующие сигналы могут привести к завершению программы без обработки функцией процессора сигналов. Как только второй входящий сигнал может быть обработан функцией процессора сигналов, последующие входящие сигналы могут работать совершенно нормально.