2015-02-04 3 views
1

프로젝트의 경우, 명령의 출력을 내 C 프로그램 (실행이라고 함)으로 파이프하여 명령을 실행해야합니다. 본 실행 예C에서 execvpe로 명령 실행하기

: echo ls -lR /usr | ./execute는 출력 (ls -lR /usr)을 수행하고 ls -lR /usr를 실행 내 C 프로그램으로 전달한다.

지침에 따르면 프로그램의 실제 실행을 위해 execvpe()을 사용해야한다고 생각합니다. 그러나 의미있는 문서를 찾을 수 없으며 이러한 오류가 발생하지 않고 작동하도록 할 수 없습니다.

execute.c: In function ‘main’: 
execute.c:98: warning: implicit declaration of function ‘getenv’ 
execute.c:98: warning: assignment makes pointer from integer without a cast 
execute.c:106: warning: implicit declaration of function ‘execvpe’ 

내 교수는 내가 #include <unistd.h>에 있다고 말하고, <stdio.h> 내가 한 이는 내 프로그램에 입력을 (내가 한 함) 구문 분석 한 다음이 수행

int main(void) { 
    char *path; 
    path = getenv("PATH"); 
    char *envp[] = {path, NULL}; 
    // the initialized array below could change normally. 
    // below is just an example 
    char *tests = {"ls", "-lR", NULL}; 
    int ret = execvpe("ls", tests, envp); 
    if(ret == -1) { printf("error\n"); } 
    return 0; 
} 

그 후 execvpe 밝혔다 우 uld가 경로를 정확하게 찾고 모든 것을 실행합니다. 하지만 내가이 경고를 계속 받으면서. 프로그램을 실행하고 즉시 경고를 무시하면 오류가 발생합니다. 누구든지 execvpe이 어떻게 작동하는지 또는 어떻게 해결할 수 있는지 알고 있습니까? 시스템을 가정

+1

맨 페이지를 보면 인자의 타입이 틀린 것을 볼 수 있습니다 (예 : 두번째 인자는'char * const []','char *'). 또한'tests'는'char * '가 아니며'char * []'입니다. man 페이지는 #include를 정확히 알려줍니다. –

+1

모든 시스템이'execvpe()'를 제공하지는 않습니다 - 예를 들어, Mac OS X는 아닙니다. –

+0

@JonathanLeffler 저는 리눅스 서버에서 ssh를 사용하고 있습니다. 맨 페이지를 더 자세히 살펴보고 char const에 대한 견습생의 조언을 듣겠습니다. – Alex

답변

0

이 코드는 작동합니다은 전혀 execvpe()이 있습니다

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

int main(void) { 
    char *path = getenv("PATH"); 
    char pathenv[strlen(path) + sizeof("PATH=")]; 
    sprintf(pathenv, "PATH=%s", path); 
    char *envp[] = {pathenv, NULL}; 
    char *tests[] = {"ls", "-lR", NULL}; 
    execvpe(tests[0], tests, envp); 
    fprintf(stderr, "failed to execute \"%s\"\n", tests[0]); 
    return 1; 
} 

환경에서 PATH=$PATH의 형식을 업데이트했습니다.

그것은 execvpe()에 명령 이름으로 tests[0] 사용 tests의 컴파일 오류 수정; 표준 오류에 대한 오류를보고합니다. 그것은 실행되지 않은 명령의 이름을 포함합니다. 종료 할 때 실패 상태 (0이 아닌)를 반환합니다. 그것은 실패했을 경우 execvpe() 만 반환한다는 것을 알기 때문에 반환 상태가 무엇인지 테스트 할 필요가 없습니다. 오류 메시지에 시스템 오류 메시지가 포함되지 않지만 <errno.h><string.h>을 포함하도록 코드를 수정하고 errnostrerror()을 사용하여 해당 정보를보고 할 수 있습니다.

+0

이것은 작동합니다. 불행히도 테스트 케이스'echo ls | ./execute'의 결과는'no ls in ((null))'입니다. 나는 그것이 envp 포인터와 관련이 있다고 생각하고 경로를 "PATH ="로 만들고 strcat에 getenv ("PATH")를 추가하라는 지시를 받았다. 이것은 나에게 seg 결함을 준다. 내가 기본적으로 문자열을 얻을 수있는 방법에 대한 아이디어 : "PATH = getenv ("PATH ")"segfault없이? – Alex

+0

@Alex : hmm, yes ... 코드는 환경에서'PATH = $ PATH'를 설정해야합니다. 그렇게하지 않으면 응답의 코드 작동에 영향을 미치지 않아야합니다. 'execvpe()'는 적어도'envp'에 설정된 환경이 아니라 호출 프로그램의 환경을 사용합니다. 적어도 AFAIK. 다른 프로그램을 테스트해야합니다. 실제로는 명령에 대한 표준 입력을 읽은 다음이를 위로 나눠서 명령과 인수를 실행하려고 시도합니다. 종종,'snprintf()'를 사용 하겠지만, sizeof ("PATH =")가 후행 null을 계산하기 때문에 정확하게 적당한 공간을 할당했습니다. –

관련 문제