2012-11-10 3 views
1

두 개의 다른 컨텍스트에서 프로세스의 '실행 env'의 차이를 어떻게 알 수 있습니까?프로세스의 실행 환경 이해

질문을 올바르게 발음하려면 /opt/plan9/에 plan9port가 설치되어 있고 /opt/plan9/bin/fortune에서 행운 프로그램을 실행하면 문제가 없습니다. (행운의 목록을 /opt/plan9/lib/fortune/opt/plan9/lib/fortune.index에서 읽음).

char* opts[] = {"fortune"}; 
execve("/opt/plan9/bin/fortune", opts, NULL); 

과 함께 C 코드 (test.c) 내부에서 호출하면 행운의 목록을 읽지 않습니다. 나는이 두 바이너리를 호출 할 때 strace를 사용하여 차이점을 확인했습니다.

open("/usr/local/plan9/lib/fortunes", O_RDONLY) = -1 ENOENT (No such file or directory) 
Misfortune! 
+++ exited with 1 +++ 

strace -f -eopen ./test

기본 메시지 "불행"을 제공합니다.

strace -f -eopen fortune

완벽하게 잘 작동
open("/opt/plan9/lib/fortunes", O_RDONLY) = 3 
Snob intellectual bachelors can't have fun in San Antonio. -Ted Nelson 
+++ exited with 0 +++ 

.

./test는 운세 파일을 어떻게 변경합니까? 바이너리가 라이브러리를 읽는 곳에서부터 exec 환경과 관련이 있어야합니다.

+2

두 번째 인수 ('opts')에서 전달 된 배열이'NULL'으로 끝나야하므로 문제가 발생하지는 않지만'execve() '를 올바르게 호출하지 않습니다. –

답변

4

execve()으로 전화 할 때 명시 적으로 NULL 환경을 설정하고 있습니다. 따라서 fortune 프로그램은 아마도 일부 환경 변수에 따라 /opt/plan9/...을 찾을 수 있습니다. 쉘 프롬프트에서 env을 입력하여 어떤 환경 변수가 설정되어 있는지 확인하십시오.

+0

관련 env 변수는/opt/plan9로 설정된 PLAN9입니다. execve()를 호출하는 동안 그것을 전달해야합니까? – swair

+0

예, 맞습니다. 'NULL' 엔트리로 환경 변수의 배열을 종료하는 것을 잊지 마십시오. –

+0

한 번 더 쿼리하십시오. 내가 zsh을 생성 할 때 fortune 바이너리를 호출하고 올바른/opt/plan9/lib/fortunes 파일을 읽지 못하면 매번 불행을 출력합니다. test.c와 같은 zsh 작업을 어떻게 만들 수 있습니까? 어떤 환경 변수를 설정해야합니까? 어떤 생각? – swair

관련 문제