2011-12-21 3 views
0

내 응용 프로그램에서 해당 세마포어를 보았습니다. were not always working as expected. 그렇다면이 예기치 않은 동작은 신호가 sem_wait 호출을 인터럽트 할 때 발생할 수 있다고 들었습니다.신호가있을 때 처리해야 할 사항

내 질문은 신호가있을 때 프로그래머가 어떤주의를 기울여야하는지에 관한 질문입니다. sem_wait의 경우 반환 값을 확인할 수 있지만 모든 비동기 안전 함수에 대해 동일합니까? 그리고 신호가 코드를 인터럽트하기를 기대할 때 우리가 염두에 두어야 할 것은 무엇입니까?

답변

2

UNIX 신호는 웜의 깡통입니다.

syscalls 및 신호에 관한 2 개의 캠프가 있습니다.

  • 시스템 V /하여 Posix 의미 : 콜이 신호에 의해 중단, 그들은 오류를 반환하고 세트는
  • BSD 의미의 콜을 EINTR errno에 신호가 발생하면 자동으로 다시 시작됩니다 (물론, 그들의 대부분 어쨌든, 일부 예를 들어 선택/투표/취침).

신호()를 사용는 기본 BSD 시스템 및 Linux 의미 BSD을 디폴트, 모두와, 상기 두개의 일이다 필요 인용 ..] 다른 시스템 V 의미를 갖는다. 는 (리눅스,이 BSD 의미를 부여 -std = gnu99와 함께, 시스템 V의 의미를 제공 -std = C99 컴파일, 많은 것들에 예를 따라 달라집니다. 참조 예 http://www.gnu.org/s/hello/manual/libc/Interrupted-Primitives.html)

당신은 sigaction의 신호 처리기를 설치

() 당신은 SA_RESTART 플래그로 어떤 의미를 선택하게된다. 기본적으로

: 당신이 그것을 도울 수 있다면

  • 가 신호를 사용하지 마십시오.
  • 가능한 경우 BSD 의미를 사용하십시오.
  • 이식성이 필요하고 신호를 처리해야하는 코드에서, 호출에 대한 호출을 검사하고 EINTR에 대한 errno를 검사하고 시스템 호출을 다시 수행하는 루프에서 각 시스템 호출을 래핑해야합니다 (또는 catch 신호).
  • 라이브러리 호출은 코드가없는 경우에도 신호를 사용할 수 있습니다.
  • 일반적으로 SyscV/Posix 의미론을 사용하는 syscalls은 -1을 반환하고 errno를 EINTR로 설정합니다. 그러나 오류 상태가 무엇인지 알기 위해 문서를 읽으십시오.

편집 : BSD 대 Sysv 의미론을 혼합하여 편집했습니다.

+0

그래서 SysV가 syscall을 자동으로 다시 시작하면, 때때로 sem_wait이 오류 코드를 제공하기 때문에 다시 시작하지 않는 이유는 무엇입니까? – MetallicPriest

+0

@ MetallicPriest 100 % 확실하지 않습니까? 어쨌든 sysv 의미 체계가있는 경우에도 자동 재시작되지 않는 syscall에 대한 목록이 있었으면합니다. sem_wait은 그 중 하나 일 수 있습니다. – user964970

+0

주어진 시스템 호출에 대한 기본 인터럽트 작업은 시스템의 맨 페이지에 문서화되어야합니다. 리눅스 시스템을 사용하고 있고 비정상적인 일을하지 않았다면 시스템 호출은 신호에 의해 중단 된 후에 투명하게 다시 시작되어야합니다. –

관련 문제