Функции процессора сигналов иногда выходят из строя - PullRequest
0 голосов
/ 01 февраля 2020

Код функции процессора сигналов:


 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]$

В соответствии с В соответствии с этим функция процессора сигналов будет выполняться по меньшей мере один раз, но последующие сигналы могут привести к завершению программы без обработки функцией процессора сигналов. Как только второй входящий сигнал может быть обработан функцией процессора сигналов, последующие входящие сигналы могут работать совершенно нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...