시그널 핸들러와 메인 프로그램이 어떻게 통신하는지 고민 중입니다. 저는 주로 비차단 신호(신호 처리기가 실행되더라도 새 신호가 도착할 수 있음)를 사용하므로 잠금 없는 솔루션을 찾고 있습니다.
현재 나의 생각은 이렇습니다.
socketpair(...)
신호 처리기를 설치하기 전에 Yet(사용)을 만듭니다sigaction(...)
.- 신호 처리기는 내가 수행해야 하는 모든 것을 해당 소켓 쌍의 파일 설명자로 보냅니다.
- 기본 프로세스는 다른 파일 설명자에서 들어오는 데이터를 폴링하고 필요에 따라 처리합니다.
물론 내부 버퍼 크기를 상당히 높게 설정하고( 를 사용하여 setSockOptInt(SOL_SOCKET, SO_SNDBUF, size);
) 오버플로 시 프로그램을 적절하게 종료할 계획입니다( send(...)
신호 처리기에서 무언가를 반환하는 것은 불가능합니다...).
신호 안전 libc 기능을 매우 엄격하게 제한하기 때문에 일부 Posix.* 표준을 위반할 수도 있다고 생각합니다. 그러나 내가 아는 한, 소켓에 쓰는 것은 원자적입니다(만약 send()
데이터그램 소켓을 사용한다면 거의 100% 그럴 것이라고 확신합니다).
맞아? 할 수 있나요?
답변1
신호 컨텍스트에서 안전한 함수 목록은 을 참조하세요 man 7 signal-safety
. 이 페이지에서:
The set of functions required to be async-signal-safe by POSIX.1 is shown in the following table. The functions not otherwise noted were required to be async-signal-safe in POSIX.1-2001; the table details changes in the subsequent standards. Function Notes ... send(2) sendmsg(2) sendto(2) ... write(2)
따라서 소켓과 관련된 파일 설명자(또는 해당 문제에 대한 모든 파일 설명자)에서 또는 를 사용하는 것이 send()
안전합니다 .write()