2009-09-23 4 views
1

유닉스 터미널을 직접 작성 중이며 명령어를 실행할 때 문제가있다 :유닉스 프로그래밍 ... fork() & execv() help ... C 프로그래밍

먼저 사용자 입력을 받는다. 그리고 그것을 버퍼에 저장하면, 나는 단어를 분리하고 그것을 argv [] 배열에 저장한다. 예 : 명령은 argv [0]에 저장된 firefox를 시작하는 "firefox"입니다.

명령을 어떻게 시작합니까? 이것은 내가 할 노력하고있어,하지만 난 점점 오류가있어 :

void launchProcess(char *command[], char *file){ 
     pid_t pid; 
     pid = fork(); 
     if (pid == -1) { 
       perror("Error when forking"); 
       exit(EXIT_FAILURE); 
     } 
     if (pid == 0){     
       fprintf(stderr, "Child pid = %d\n", getpid()); 
       execv(file, command); 
      } 

I 전화 : launchProcess

에 대한 충돌 유형 : 오류 : 나는 다음과 같은 오류를 얻을 수

launchProcess(commandArgv, "STANDARD"); 

+0

commandArgv의 유형은 무엇입니까? – camh

+0

귀하의 질문에 중요한 것은 아니지만 "터미널"이 아닌 "쉘"(사용자와 OS 사이의 인터페이스)을 작성하고있는 것처럼 보입니다 (텍스트 입력과 텍스트가있는 사용자 I/O 장치 또는 그래픽 디스플레이). – outis

+0

컴파일 타임 또는 런타임에 오류가 발생합니까? 유형 관련 오류는 일반적으로 컴파일 타임 오류입니다.이 경우 런타임 오류가 발생하여 launchProcess가 약간의 오해를 불러 일으킬 수 있습니다. 두 경우 모두 오류를 생성하는 호출 루틴에서 최소한의 선언 세트를 표시해야합니다. – dmckee

답변

8

충돌하는 유형 오류가있는 경우 나열된 함수의 선언과 유형이 동일한 지 확인해야합니다.

또한 알 수 있겠지만 execv에는 실행 파일에 대한 완전한 경로가 필요하므로 "STANDARD"와 같은 값은 작동하지 않습니다. 바이너리의 위치를 ​​결정하기 위해 PATH 변수를 사용하려면 execvp을 사용하십시오. 또한 argv 배열의 마지막 값이 NULL인지 확인해야합니다. 마지막으로 execv의 반환 값을 확인하십시오. 예를 들어, 사용자가 존재하지 않는 프로그램을 실행하려고 시도하는 경우, 실패 할 수있는 확실한 가능성이있다.

2

다음과 같이 함수를 프로토 타입해야합니다. "void launchProcess (char * command [], char * file);" 귀하의 주요 기능 위에.

데이터 유형이 올바른 것처럼 보이지만 매개 변수 이름 "file"및 "command"를 기반으로하면 잘못된 방식으로 함수를 사용하는 것처럼 보입니다.

다음은 인수없이 ls 함수를 실행 한 예입니다.

char * args [] = {NULL}; execv ("/ bin/ls", args);