2011-09-22 9 views
2

C 프로그램 (UNIX 내부)에서 프로그램을 실행하려고합니다.UNIX 다른 프로그램에서 프로그램을 실행하십시오.

exec (실행 중에 문자열 입력이 필요하고 해당 입력을 sample이라는 다른 파일에 씁니다)라는 이름의 exec 파일이 program.c에서 실행되지만 간접 입력을 통해 문자열 입력을 제공하려고합니다.

% vim input 

내가

#include<unistd.h> 
int main() 
{ 
     const char* command = "./exec < input"; 
     execvp(command, NULL); 
     return 0; 
} 

때 I를 입력 파일 program.c에 지금의

content 

내에서 다음을 쓴 다음과 같이 그 내용은

나는 파일을 생성 프로그램을 실행하면 내용이 샘플 파일에 입력되지 않습니다.

하지만, 간접없이 실행할 때 즉

const char* command = "./exec"; 

후 작동, 입력 샘플 파일에 저장에 들어갔다.

간접 구문에서 내가 뭘 잘못하고 있는지 말할 수 있습니까?

감사합니다.

답변

4
등이 배시, csh, ksh를 같은 쉘에 의해 해석하도록되어 사용하는 구문은

시스템 호출 execvp는 실행 파일의 경로 및 인수의 수를 예상

는, 쉘은

거기에서 호출되지 않았습니다.

이 방법으로 리디렉션을 수행하려면 execvp를 호출하기 전에 dup2(2) 시스템 호출을 사용해야합니다 :

int fd = open("input", O_RDONLY); 
/* redirect standard input to the opened file */ 
dup2(fd, 0); 
execvp("/path/to/exec", ...); 

은 물론, 당신은 실제 프로그램에서 검사를 일부 추가 오류가 필요합니다.

1

execvp으로 리디렉션 할 수 없습니다. system()을 사용하거나 dup() 및 친구들과 친해지시기 바랍니다. 당신은 google '리다이렉션 구현'을 할 것입니다. 쉘 (예를 들어)이이 문제를 어떻게 다루는 지에 대한 예제를 많이 보게 될 것입니다.

0

exec(3) 함수 모음은 입력 리디렉션이나 구문 분석 명령 줄에 대해 알지 못합니다. 사용자가 지정한 실행 파일을 정확하게 실행하려고 시도합니다. 당연히 존재하지 않는 이름이 "./exec < input" 인 실행 파일을 찾으려고합니다.

하나의 해결책은 exec 대신 system(3) 함수를 사용하는 것입니다. system은 사용자의 셸 (예 : /bin/bash)을 호출합니다.이 쉘은 명령 줄을 구문 분석하고 적절한 리디렉션을 수행 할 수 있습니다. 그러나 system()exec만큼 다양하지 않으므로 필요에 따라 적합하지 않을 수도 있습니다.

더 나은 해결책은 직접 입력 리다이렉션을하는 것입니다.우리가해야 할 일은 파일을 열려면 open(3)을 사용하고 dup2(3)을 사용하여 파일 설명자를 파일 설명자 0 (표준 입력)에 복제 한 다음 exec 실행 파일을 사용하십시오.

관련 문제