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
이 문제의 원인이 무엇인지 아는 사람이 있습니까?