2011-10-03 3 views
0

안녕하세요, 저는 C++로 셸을 작성하려고하는데 exec 명령에 입력 파일을 사용하는 기능에 문제가 있습니다. 예를 들어, Linux의 bc 쉘은 "bc < text.txt"를 수행하여 텍스트의 행을 유행과 같은 배치로 계산할 수 있습니다. 나는 나의 껍질과 마찬가지로하려고 노력하고있다.파일 입력이있는 exec 패밀리

char* input = “input.txt”; 
execlp(input, bc, …..) // I don’t really know how to call the execlp command and all the doc and search have been kind of cryptic for someone just starting out. 

이렇게해도 exec 명령을 사용할 수 있습니까? 또는 줄 단위로 읽고 exec 명령을 for 루프에서 실행해야합니까 ??

+1

execlp는 단일 프로세스를 시작하는 데 사용됩니다. 입력 파일을 한 줄씩 읽고 각 명령을 개별적으로 처리해야합니다. – CurtisB

+0

execlp()는 컴파일 타임에 명령과 인수를 알고있을 때만 사용됩니다. 쉘을 사용하는 경우가 거의 없습니다. exec *() 계열의 함수 중 execv *() 부분을 사용한다고 가정해야합니다. –

답변

1

리디렉션이 셸에 의해 수행되고 있습니다. bc에 대한 인수가 아닙니다. 당신은 표준 파일 기술자를 bash는 (bash -c "bc < text.txt"에 해당)

예를 들어, 당신은 파일을 열 수 있습니다

"bash" 
"-c" 
"bc < text.txt" 
+0

쉘을 쓰고 있다면 다른 쉘을 사용해서는 안됩니다. –

+0

@BenVoigt 사실인데, "리눅스에서 bc 쉘은"bc

3

"bash" 및 인수 목록의 파일 인수 execvp을 사용할 수 있습니다를 호출하고 dup2() 수 있습니다 표준 입력을 닫은 다음 파일을 열 수 있습니다 (표준 입력은 설명자 0이고 open()은 사용 가능한 가장 낮은 번호의 설명자를 반환하기 때문에 작동 함). 이 자식 프로세스이기 때문에

const char *input = "input.txt"; 
int fd = open(input, O_RDONLY); 
if (fd < 0) 
    throw "could not open file"; 
if (dup2(fd, 0) != 0) // Testing that the file descriptor is 0 
    throw "could not dup2"; 
close(fd);    // You don't want two copies of the file descriptor 
execvp(command[0], &command[0]); 
fprintf(stderr, "failed to execvp %s\n", command[0]); 
exit(1); 

당신은 아마 최소한의 throw보다 더 영리 오류 처리를 원하는 것 그리고 알 필요가 부모입니다. 그러나 throw 사이트는 오류가 처리되는 지점을 표시합니다.

close()에 유의하십시오.

관련 문제