Linux 운영 체제의 절전 문서에 대한 질문이 있습니다.
자고있는 남자 3설명하다:
스레드 안전성과 관련하여
sleep()
"MT-Unsafe sig: SIGCHLD/linux"가 있는데, 이는 Linux에서sleep()
신호 처리기가 임시로 설치될 수 있음 을 의미합니다SIGCHLD
.
그러나 동일한 문서에는 "Linux sleep()
에서는 nanosleep(2)
.
이 확인되었습니다수면 구현GNU 표준 라이브러리 내.
남성 2nm 수면설명하다:
"POSIX.1은 (
nanosleep
) 신호와 상호 작용하지 않는다고 명시적으로 명시합니다." Nanosleep은 "호출 스레드에서 핸들러 호출을 트리거하는 신호를 전달"(nanosleep 매뉴얼 참조)하여 중단될 수 있습니다.
질문은 다음과 같습니다.
sleep(3)
Linux에서 문서화 문제가 있습니까?
"MT-Unsafe sig:SIGCHLD/linux"에 대한 문서는 잘못된 것 같습니다. 문서에 따르면 Linux에서 이를 sleep(3)
사용해 nanosleep(2)
도 방해가 되지 않기 때문입니다.SIGCHLD
nanosleep(2)
아니면 내가 뭔가를 놓치고 있는 걸까?
답변1
texinfo의 댓글원천좀 더 명확하게 말하면:
@deftypefun {unsigned int} sleep (unsigned int @var{seconds})
@standards{POSIX.1, unistd.h}
@safety{@prelim{}@mtunsafe{@mtascusig{:SIGCHLD/linux}}@asunsafe{}@acunsafe{}}
@c On Mach, it uses ports and calls time. On generic posix, it calls
@c nanosleep. On Linux, it temporarily blocks SIGCHLD, which is MT- and
@c AS-Unsafe, and in a way that makes it AC-Unsafe (C-unsafe, even!).
그것이 거짓말이 아니라면 sleep(3)
Linux에는 차단 기능이 없습니다 SIGCHLD
. 이는 단지 오래된 해결 방법의 잔재일 뿐입니다.2015년에 삭제됨) 이전 Linux 버그의 경우(2.6.32에서 수정됨)
이것은범죄언어는 다음에서 소개됩니다.
* manual/time.texi: Document MTASC-safety properties.
author Alexandre Oliva <[email protected]>
Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
committer Alexandre Oliva <[email protected]>
Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
commit 23e5b8cb1ba7a31450bda75e3f06b7c76e175db4
답변2
Linux 내부에 대한 경험이 더 많은 사람이 내 말을 수정할 수 있지만 주변 문서를 보면 임시로 설치될 를 sleep()
통해 구현할 권한을 유지하려는 것처럼 보입니다 .alarm()
SIGALRM
이는 실제 문서에는 언급되지 않았지만 SIGCHLD
여전히 "MT-Unsafe sig"에 속합니다.