_REENTRANT 플래그란 무엇입니까?
우리가 사용하는 멀티스레드 프로그램을 아래와 같이 컴파일하는 것.
gcc -lpthread -D_REENTRANT -o someprogram someprogram.c
깃발이 정확히 무엇입니까?-D_REENTRANT
여기서 뭐해요?
_REENTRANT를 정의하면 컴파일러가 C 라이브러리에 있는 여러 함수의 스레드 세이프(즉, 재진입) 버전을 사용하게 됩니다.
헤더 파일을 검색하여 정의된 경우에 어떤 일이 발생하는지 확인할 수 있습니다.
libc 8.2 설명서에서 발췌:
매크로: _REENTRANT
매크로: _THREAD_SAFE이 매크로들은 더 이상 쓸모가 없습니다.값 199506L로 _POSIX_C_SOURES를 정의하는 것과 동일한 효과가 있습니다.
매우 오래된 일부 C 라이브러리는 기본 기능(예: getchar)에 대해 스레드 세이프(thread-safe)를 위해 이러한 매크로 중 하나를 정의할 것을 요구했습니다.
새 프로그램에서는 _GNU_SOURE를 사용하는 것이 좋습니다.GCC에 '-ansi' 옵션이나 -std=c99와 같은 다른 적합성 옵션을 지정하지 않고 이러한 매크로를 명시적으로 정의하지 않으면 _DEFAULT_SOURES를 1로 정의하는 것과 같은 효과가 발생합니다.
더 큰 등급의 피쳐를 요청하기 위해 피쳐 테스트 매크로를 정의하는 경우 해당 피쳐의 하위 집합에 대해 피쳐 테스트 매크로를 추가로 정의하는 것은 무해합니다.예를 들어 _POSIX_C_SOURNECT를 정의하는 경우 _POSIX_SOURNECT도 정의하지 않습니다.마찬가지로 _GNU_SOURNECT를 정의하면 _POSIX_SOURNECT 또는 _POSIX_C_SOURNECT 중 하나를 정의해도 효과가 없습니다.
제이엠은 이렇게 대답했습니다.
_REENTRANT를 정의하면 컴파일러가 C 라이브러리에 있는 여러 함수의 스레드 세이프(즉, 재진입) 버전을 사용하게 됩니다.
헤더 파일을 검색하여 정의된 경우에 어떤 일이 발생하는지 확인할 수 있습니다.
OP와 저는 둘다 질문에 관심이 많아서 실제로 답을 올리기로 했습니다. :) 다음과 같은 일들이 발생합니다._REENTRANT
Mac OS X 10.11.6의 경우:
<math.h>
에 대한 신고를 득함lgammaf_r
,lgamma_r
,그리고.lgammal_r
.
리눅스(Red Hat Enterprise Server 5.10)에서 다음과 같은 변경 사항이 표시됩니다.
<unistd.h>
POSIX 1995 함수에 대한 선언을 얻습니다.getlogin_r
.
그래서 뭔가._REENTRANT
요즘은 대부분 노옵(No opp.그것은 한때 다음과 같은 많은 새로운 기능을 선언했을지도 모릅니다.strtok_r
; 하지만 요즘은 그러한 기능들이 대부분 수십 년 된 다양한 표준(C99, POSIX 95, POSIX.1-2001 등)에 의해 의무화되어 있기 때문에 항상 활성화되어 있습니다.
제가 확인한 두 시스템이 왜 선언을 피하는지 모르겠습니다.lgamma_r
반응을 보다getlogin_r
언제_REENTRANT
#정의되지 않았습니다.제 추측으로는 이것은 아무도 겪지 않고 치우려고 하지 않았던 역사적인 공예품일 뿐입니다.
물론 이 두 시스템에 대한 제 관찰이 코드가 마주칠 수 있는 모든 시스템에 일반화되지는 않을 것입니다.당신은 분명히 여전히 통과해야 합니다.-pthread
컴파일러에게(또는 덜 좋지만 괜찮음)-lpthread -D_REENTRANT
프로그램에 pthread가 필요할 때마다.
다중 스레드 프로그램에서 컴파일러에게 #가 프로그램에 줄을 포함하기 전에 _REENTRANT 매크로를 정의하여 이 기능이 필요하다고 알립니다.이것은 세 가지 일을 수행하며, 매우 우아하게 수행하기 때문에 일반적으로 무엇이 이루어졌는지 알 필요가 없습니다.
- 일부 기능은 재진입 안전 등가물에 대한 프로토타입을 제공합니다.이들은 일반적으로 동일한 함수 이름이지만 _radded가 있으면 gethostbyname이(가) gethostbyname_r로 변경됩니다.
- 일반적으로 매크로로 구현되는 일부 stdio.h 함수는 적절한 재진입 안전 함수가 됩니다.
- errno.h의 변수 errno는 다중 스레드 안전한 방법으로 실제 errno 값을 결정할 수 있는 함수를 호출하도록 변경됩니다.
리눅스 프로그래밍을 시작할 때 가져옴
간단히 _REENTRANT를 전처리기용으로 정의했습니다.연관된 코드 어딘가에서 아마#ifdef _REENTRANT
아니면#if defined(_REENTRANT)
적어도 몇 군데는
또한 "_REENTRANT:"라는 이름은 구현자의 이름 공간에 있습니다(밑줄로 시작하여 다른 밑줄이나 대문자로 시작하는 이름은 모두 해당). 따라서 이 이름을 정의하면 표준이 정의하는 범위를 벗어났다는 것을 의미합니다(적어도 C 또는 C++ 표준).
언급URL : https://stackoverflow.com/questions/2601753/what-is-the-reentrant-flag
'programing' 카테고리의 다른 글
매 n번째 줄 팬더 (0) | 2023.11.04 |
---|---|
C 프로그래머의 관점에서 ARM 아키텍처 간의 차이? (0) | 2023.11.04 |
ui-grid 행의 높이를 변경하는 방법은? (0) | 2023.11.04 |
pip을 사용할 수 없기 때문에 pyvenv가 작동하지 않습니다. (0) | 2023.11.04 |
사용자 지정 파이썬 목록 정렬 (0) | 2023.11.04 |