2013-04-27 1 views
0

내가 몇 UNIX 명령을 실행하는 코드의 조각을 실행하는 것을 시도하고있다가,이 명령은 배열 lineArray에 저장된 명령을 실행하지 않습니다 내 함수가 execvp MAN에 따라 명령과 인수를 올바르게 구문 분석한다는 것을 디버그에서 보았지만 배열의 첫 번째 명령 만 출력합니다.execvp는이 예를 들어

모든 종류의 도움을 주실 수 있습니다.

int startProcesses(int background) { 
int i = 0; 
int j = 0; 
int pid; 
int status; 
char *copyProcessName[256]; 
int len, var=0; 

while(lineArray[i] != NULL) { 

    while(*(copyProcessName+var) != NULL) { 
     copyProcessName[var] = NULL; 
    } 

    j=0; 
    copyProcessName[j] = strtok(lineArray[i], " "); 
    while (copyProcessName[j] != NULL){ 
     j++; 
     copyProcessName[j] = strtok(NULL, " "); 
    } 


    pid = fork(); 

    if (pid == 0) { 
     // Child Process 
     execvp(copyProcessName[0], copyProcessName); 
     fflush(stdout); 
     i++; 
     continue; 

    } else if (!background) { 
     // Parent Process 
     waitpid(pid, &status, 0); 
     i++; 
     if(WEXITSTATUS(status)) { 
      printf(CANNOT_RUN_ERROR); 
      return 1; 
     } 
    } else { 
     i++; 
     continue; 
    } 
} 
return 0; 

}

+1

'len = strlen (copyProcessName); ', 어떻게 생각하세요? 'copyProcessName'은'char * [256]'이므로'strlen'의 인자로'char **'로 변환됩니다. 컴파일러가 그것에 대해 불평하지 않았습니까? 또한'execvp'가 반환되면 자식은'continue'가 아니라 죽어야합니다. –

답변

3

이 코드는 분명 옳지 않다 :

len가 제로가 될 수 있다면, 우리는 copyProcessName의 내용이 실제로 포함 된 내용을 아무 생각이 없다는 것을 감안할 때
len = strlen(copyProcessName); 
for (var = 0; var < len; ++var) { 
    copyProcessName[var] = NULL; 
} 

.

while(*(lineArray+i) != NULL) 

뭐가 잘못 :

while(lineArray[i] != NULL) 

그것은 짧은, 그리고 당신은 아마 인덱스 그것에 []를 사용하려면, 그래서 그것이 배열입니다.

반환 값 execvp(..)도 확인해야합니다. 반환하면 반환 값이 무엇인지 잘못 인쇄했을 수 있으므로 인쇄해야합니다. 이 문제의 결정적인 목록이 아닙니다

copyProcessName[j] = strtok(lineArray[i], " "); 
while (copyProcessName[j] != NULL){ 
    j++; 
    copyProcessName[j] = strtok(NULL, " "); 
} 

: 당신은 아마 문제의 모든 종류의 원인이됩니다 아래 코드에 도착하면 외부 루프의 두 번째 반복에서

j는 0이 아닌 귀하의 코드, 그냥 내가 그것을 통해 오히려 빠르게 읽을 때 발견.

+1

아,하지만'* (array_name + index)'는 그다지 중요하지 않습니다. –

+0

execvp의 반환 값에 대해 더 자세히 설명해주십시오. – Steinfeld

+0

맨 페이지를 읽으십시오. "에러가 발생하면 반환 값은 -1이고, 에러의 이유는'errno'에 저장됩니다. –