sigtimedwait는 errno를 ETIMEDOUT, timeout=0으로 설정합니다.

sigtimedwait는 errno를 ETIMEDOUT, timeout=0으로 설정합니다.

cpp 다중 스레드 프로그램에서는 sigwait모든 스레드가 생성되고 프로그램이 초기화된 후 주 함수 끝에 Linux 구현 복사본을 사용합니다.

   sigset_t  mask;
   struct sigaction sa;
   signal(SIGPIPE, SIG_IGN);

   sigemptyset(&mask);
   sigaddset(&mask, SIGINT);
   
   sa.sa_flags = SA_SIGINFO | SA_NODEFER;
   sa.sa_sigaction = handler;
   sigaction(SIGINT, &sa, NULL);

   // Copy/paste of sigwait source code 
   // but keeping full siginfo (instead of just returning signo)
   // and adding ETIMEDOUT as a do/while continue condition
   siginfo_t si = {};
   int ret = 0;
   do
   {
      ret = sigtimedwait (&mask, &si, 0);      
      if(ret == -1)
      {
         if(errno == ETIMEDOUT)
         {
            printf("sigtimedwait timeout\n");
         }
      }
   }
   while (ret < 0 && (errno == EINTR || errno == ETIMEDOUT));

sigwait구현 참조:

int
__sigwait (const sigset_t *set, int *sig)
{
  siginfo_t si;
  int ret;
  do
    ret = __sigtimedwait (set, &si, 0);
  /* Applications do not expect sigwait to return with EINTR, and the
     error code is not specified by POSIX.  */
  while (ret < 0 && errno == EINTR);
  if (ret < 0)
    return errno;
  *sig = si.si_signo;
  return 0;
}

sigtimedwait참고용 진술:

int sigtimedwait(const sigset_t *restrict set, 
                 siginfo_t *restrict info, 
                 const struct timespec *restrict timeout);

sigtimedwait프로그램이 높은 부하에서 실행될 때, 즉 프로세스가 CPU의 50%를 초과하여 사용하는 경우 거의 모든 사용 가능한 메모리가 SD 카드 쓰기 작업을 위해 캐시 errno되도록 설정하십시오 .ETIMEDOUT

이 조건은 항상 반복 가능한 것은 아니지만 최대 3분 동안 지속되는 높은 부하 시퀀스 중에 무작위로 한 번 이상 발생합니다. 정상적인 작동 중에는 이런 일이 발생하지 않습니다.

우리는 armv7l에서 Linux 4.14를 실행하고 있습니다.

sigaddset 및 sigaction에 가능한 모든 신호를 추가한 후에도 sigaction이 handler호출되지 않습니다. 보면 siginfo_t si어떤 값도 설정되어 있지 않습니다. 판독 값은 0입니다.

Linux 매뉴얼에서 sigtimedwait반품 에 관한 내용을 찾을 수 없습니다.ETIMEDOUT

이 문제의 원인이 무엇인지 아는 사람이 있습니까?

관련 정보