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는 다음을 보장합니다.
- 거기 이다 지정된 각 유틸리티의 표준 호환 버전으로 절대 경로 A는,
- 그리고이 절대 경로를 찾고이 유틸리티를 실행할 수 있어야합니다.
각 유틸리티가 모든 시스템 ( /bin/ps
) 의 특정 디렉토리에 있어야 하는 것은 아니지만 반드시 보장됩니다. 시스템 기본 PATH에서 실행 파일로 찾을 수 있음 을 합니다.
실제로, 표준에서이 작업을 수행하는 유일한 표준 지정 방법을 통해 (C에서)이다 unistd.h
의 조합을 통해,의 _CS_PATH 또는 셸에서 ‘ command
와 getconf
유틸리티, 즉, PATH="$(command -p getconf PATH)" command -v ps
항상 고유의 절대 경로를 반환해야합니다 POSIX 호환을 특정 시스템에 제공됩니다. 즉, 구현 정의 되어있는 동안ps
시스템 기본 PATH 변수에 포함 경로 있지만 이러한 유틸리티 는 항상 지정된 경로 중 하나에서 사용 가능하고 고유하며 호환 가능 해야합니다 .