programing

_REENTRANT 플래그란 무엇입니까?

powerit 2023. 11. 4. 13:22
반응형

_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와 저는 둘다 질문에 관심이 많아서 실제로 답을 올리기로 했습니다. :) 다음과 같은 일들이 발생합니다._REENTRANTMac 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 매크로를 정의하여 이 기능이 필요하다고 알립니다.이것은 세 가지 일을 수행하며, 매우 우아하게 수행하기 때문에 일반적으로 무엇이 이루어졌는지 알 필요가 없습니다.

  1. 일부 기능은 재진입 안전 등가물에 대한 프로토타입을 제공합니다.이들은 일반적으로 동일한 함수 이름이지만 _radded가 있으면 gethostbyname이(가) gethostbyname_r로 변경됩니다.
  2. 일반적으로 매크로로 구현되는 일부 stdio.h 함수는 적절한 재진입 안전 함수가 됩니다.
  3. errno.h의 변수 errno는 다중 스레드 안전한 방법으로 실제 errno 값을 결정할 수 있는 함수를 호출하도록 변경됩니다.

리눅스 프로그래밍을 시작할 때 가져옴

간단히 _REENTRANT를 전처리기용으로 정의했습니다.연관된 코드 어딘가에서 아마#ifdef _REENTRANT아니면#if defined(_REENTRANT)적어도 몇 군데는

또한 "_REENTRANT:"라는 이름은 구현자의 이름 공간에 있습니다(밑줄로 시작하여 다른 밑줄이나 대문자로 시작하는 이름은 모두 해당). 따라서 이 이름을 정의하면 표준이 정의하는 범위를 벗어났다는 것을 의미합니다(적어도 C 또는 C++ 표준).

언급URL : https://stackoverflow.com/questions/2601753/what-is-the-reentrant-flag

반응형