소켓 쌍을 신호 안전 버퍼로 사용할 수 있습니까?

소켓 쌍을 신호 안전 버퍼로 사용할 수 있습니까?

시그널 핸들러와 메인 프로그램이 어떻게 통신하는지 고민 중입니다. 저는 주로 비차단 신호(신호 처리기가 실행되더라도 새 신호가 도착할 수 있음)를 사용하므로 잠금 없는 솔루션을 찾고 있습니다.

현재 나의 생각은 이렇습니다.

  1. socketpair(...)신호 처리기를 설치하기 전에 Yet(사용)을 만듭니다 sigaction(...).
  2. 신호 처리기는 내가 수행해야 하는 모든 것을 해당 소켓 쌍의 파일 설명자로 보냅니다.
  3. 기본 프로세스는 다른 파일 설명자에서 들어오는 데이터를 폴링하고 필요에 따라 처리합니다.

물론 내부 버퍼 크기를 상당히 높게 설정하고( 를 사용하여 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()

관련 정보