POSIX는 표준 유틸리티에 대한 경로를 보장합니까? ps)를 실행하는 가장 쉬운 방법은 무엇입니까? 예를 들어,

C에서 표준 유틸리티 (예 : ps)를 실행하는 가장 쉬운 방법은 무엇입니까?

예를 들어, 표준,합니까 POSIX 보증 ps/bin/ps또는 내가 함께 무엇을 얻을에 PATH 환경 변수를 재설정해야 confstr(_CS_PATH, pathbuf, n);하고 PATH 검색을 통해 유틸리티를 실행?



답변

아니, 그것은 주로 그것을 준수하는 시스템을 필요로하지 않는다는 이유로하지 않습니다 기본적으로 , 또는을 준수하는 경우에만 (다른 표준의 배제) POSIX 표준.

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

심지어 sh는 보장되지 않습니다 /bin. Solaris에서는/bin/sh Solaris 10까지 Bourne 쉘 (POSIX 호환이 아님) 이었지만 Solaris 11에서는 여전히 ksh93입니다 (여전히 POSIX 호환은 아니지만 실제로는 그 이상입니다 /usr/xpg4/bin/sh).

C에서, 당신은 exec*p()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"...);

가 있다는 희망 sh$PATH는 Bourne의이 같은, 또한 거기에 있다는 것을, getconf그것이 POSIX 당신이있는 거 관심의 버전에 대한 하나있다.


답변

사실 저는 크게 대답 합니다 . POSIX는 다음을 보장합니다.

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

각 유틸리티가 모든 시스템 ( /bin/ps) 의 특정 디렉토리에 있어야 하는 것은 아니지만 반드시 보장됩니다. 시스템 기본 PATH에서 실행 파일로 찾을 수 있음 을 합니다.

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

< unistd.h >, command를 참조하십시오 .


답변