signalfd와 sigwaitinfo의 차이점은 무엇입니까?

signalfd와 sigwaitinfo의 차이점은 무엇입니까?

예제와 매뉴얼 페이지를 살펴봤지만 signalfd와 sigwaitinfo 사이의 차이점을 파악할 수 없습니다. 구문 외에도 둘 다 동일한 작업을 수행하며 신호가 세부 정보를 일부 구조에 저장하기를 기다리고 있습니다.

맨페이지에 이렇게 적혀있습니다. 이는 신호 사용에 대한 대안을 제공합니다. select(2), poll(2) 및 epoll(7)을 통해 파일 설명자를 모니터링하는 이점이 있는 핸들러 또는 sigwaitinfo(2).

이것이 정확히 무엇을 의미하는지 설명해 줄 수 있는 사람이 있나요?

답변1

select(2), poll(2) 및 epoll(7) 시스템 호출은 단순히 파일 설명자(I/O 채널을 나타내는 작은 정수)에서 이벤트를 기다리는 방법입니다. 이벤트에는 "데이터 읽기", "쓰기 준비" 등이 포함될 수 있습니다. 코드는 결국 이벤트를 생성할 파일 설명자 세트를 구성한 다음 select(), poll() 또는 epoll()을 호출하여 데이터가 도착하고 커널이 다음을 사용하여 소켓을 다른 호스트에 연결할 때까지 프로그램을 기다리게 합니다. 어쨌든 설명자는 틀렸습니다.

signalfd(2)는 새로운 이벤트를 추가합니다: 신호 도착. unix/linux/*BSD에서 "신호"는 다소 비동기 이벤트입니다. CPU가 잘못된 명령을 실행하려고 시도하고, I/O가 준비되고, 코드가 0으로 나뉘고, 모뎀이 정지됩니다. signalfd(2)를 사용하면 신호가 도착할 때 이벤트를 생성하는 select(), poll(), epoll()에서 사용할 수 있는 파일 설명자를 생성할 수 있습니다.

과거에는 신호가 도착했을 때 커널이 마술처럼 호출하는 핸들러 함수를 지정했습니다("업콜"이라고도 함). sigaction() 시스템 호출을 사용하여 커널에 어떤 함수를 호출할지 알려주면 sigwaitinfo()와 동일한 정보를 얻게 됩니다.

signalfd() 대신 signal() 또는 sigaction()을 사용하여 핸들러 함수를 설정하는 것의 차이점은 핸들러 함수가 언제든지 마법처럼 호출될 수 있다는 것입니다. 코드의 일부는 재진입이 가능해야 합니다(스레드로부터 안전할 뿐만 아니라 주의하세요). 귀하) 신호의 "언제든지" 특성을 처리합니다. signalfd()를 사용하면 신호는 코드의 이벤트 루프에서 처리되는 또 다른 이벤트일 뿐입니다. 코드는 평소대로 실행됩니다.

sigwaitinfo()는 지정한 신호가 도착할 때까지 코드를 일시 중지합니다. 이 신호가 도착할 때까지 코드는 아무 작업도 수행하지 않습니다. 이벤트 루프가 없으면 아무것도 없습니다. sigwaitinfo()도 Linux 커널의 실시간 기능의 일부인 것 같습니다. sigwaitinfo()는 호출할 함수를 지정하는 것이 아니라 신호가 도착할 때 커널이 호출할 코드의 위치를 ​​지정하는 것으로 생각할 수 있습니다.

다음에 추가:

방금 알아냈어"자기 관리 기술"에 관한 블로그 게시물". 신호 및 선택 기반 I/O를 처리하는 것은 코드 측면에서 불편할 뿐만 아니라 "불쾌한 경쟁 조건"으로 어려움을 겪을 수도 있습니다. 자체 파이프라인 트릭은 본질적으로 signalfd(2)가 수행하는 작업을 수행하여 이 문제를 해결합니다. 그러나 문제는 모두 사용자 공간에 있으며 더 많은 코드가 필요합니다.

답변2

간단히 말해서, sigwaitinfo()를 사용하면 신호만 기다릴 수 있습니다. poll/select/etc와 함께 signalfd()를 사용하면 파일 설명자(파일 IO, timerfd, eventfd 등)를 통해 액세스할 수 있는 모든 이벤트를 기다릴 수 있습니다.

관련 정보