POSIX는 표준 유틸리티에 대한 경로를 보장합니까?

POSIX는 표준 유틸리티에 대한 경로를 보장합니까?

C에서 ps와 같은 표준 유틸리티를 실행하는 가장 간단한 방법은 무엇입니까?

예를 들어, POSIX는 ps표준을 보장합니까, /bin/ps아니면 PATH 환경 변수를 내가 얻은 값으로 재설정 confstr(_CS_PATH, pathbuf, n);한 다음 PATH 검색을 통해 유틸리티를 실행해야 합니까?

답변1

아니요, 그렇지 않습니다. 주로 시스템이 다음 사항을 준수할 필요가 없기 때문입니다.기본적으로, 또는 준수오직POSIX 표준(다른 표준 제외)

예를 들어, Solaris(인증된 호환 시스템)는 유틸리티에 대해 이전 버전과의 호환성을 선택했습니다 /bin. 이는 이러한 유틸리티가 신비한 방식으로 작동하고 다양한 위치에서 POSIX 호환 유틸리티를 제공하는 이유를 설명합니다( 다른 버전의 XPG(현재 POSIX와 병합) 표준 /usr/xpg4/bin의 경우 /usr/xpg6/bin실제로는 Solaris의 선택적 구성 요소의 일부입니다.

입장 도 sh보장 되지 않습니다 /bin. Solaris에서는 /bin/shSolaris 10까지 Bourne 쉘(따라서 POSIX와 호환되지 않음)이었지만 이제 Solaris 11에서는 ksh93이 사용됩니다(아직 완전히 POSIX와 호환되지는 않지만 실제로는 POSIX와 더 많이 호환됨 /usr/xpg4/bin/sh).

exec*p()C에서는 POSIX 환경에 있다고 가정하고 사용할 수 있습니다 (특히 PATH환경 변수 관련).

PATH환경 변수를 설정할 수도 있습니다

#define _POSIX_C_SOURCE=200809L /* before any #include */
...
confstr(_CS_PATH, buf, sizeof(buf)); /* maybe append the original
                                      * PATH if need be */
setenv("PATH", buf, 1);
exec*p("ps"...);

또는 빌드 시 실행할 POSIX 유틸리티의 경로를 결정할 수 있습니다(GNU 시스템과 같은 일부 시스템에서는 POSIXLY_CORRECT규정 준수를 보장하기 위한 변수 설정과 같은 추가 단계가 필요하다는 점을 염두에 두십시오).

다음을 시도해 볼 수도 있습니다.

execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
                         "unset IFS;shift \"$1\";"
                         "exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);

Bourne의 것과 유사한 shin이 있고 관심 있는 POSIX 버전용 a도 있기를 바랍니다.$PATHgetconf

답변2

사실 제가 주로 대답하는 건. POSIX는 다음을 보장합니다.

  1. 거기지정된 각 유틸리티의 표준 호환 버전에 대한 절대 경로,
  2. 그리고 이 절대 경로를 찾고 이 유틸리티를 실행할 수 있어야 합니다.

각 유틸리티가 반드시 모든 시스템( )의 특정 디렉토리에 있다고 보장되는 것은 아니지만 /bin/ps항상 보장됩니다.가능했다실행 파일로 시스템 기본 경로에서 찾을 수 있습니다.

실제로 표준에서 이를 수행하는 유일한 표준 지정 방법은 (C에서) unistd.h_CS_PATH를 통하거나 셸에서 commandgetconf유틸리티의 조합을 통하는 것입니다. 즉, PATH="$(command -p getconf PATH)" command -v ps고유한 절대 경로가 항상 반환되어야 합니다.이것ps특정 시스템에서 제공되는 POSIX 호환. 즉, 구현에 따라 정의되어 있지만어느경로는 시스템의 기본 PATH 변수에 포함되어 있으며 이러한 유틸리티는항상 해야 한다여기에 지정된 경로 중 하나에서 사용 가능하고 고유하며 호환됩니다.

참조:<unistd.h>,주문하다.

관련 정보