2017-12-06 6 views
0

나는 5 개의 자식 프로세스를 생성 한 다음 execvp를 전달하는 숫자가 짝수인지 아닌지를 알려주는 isEven이라는 두 번째 프로그램에 자식 프로젝트를 생성하려고합니다. 그러나 execvp 호출은 gdb에서 실행하면서 계속 실패하고 실행되지 않습니다. args 및 load (args)는 모두 다른 함수에서 호출됩니다.c execvp를 사용하여 프로그래밍

미리 감사드립니다.

//Code to load binary 
void load(char* args[]) 
{ 
    execvp("./isEven", args); 
    printf("ERROR\n"); 
} 

//args being passed in 
char *args[] = {"./isEven", number, NULL}; 
load(args); 

여기 제가 작성한 작은 프로그램이 제가 지금하고있는 것과 똑같은 일을합니다. Gdb에서 세그먼트 오류가 발생했다고합니다.

int main(int argc, char *argv[]) 
{ 
    int returnCode = fork(); 

    if(returnCode == 0) 
    { 
     char *args[] = {"./isEven", 12345, NULL}; 
     execvp("./isEven", args); 
     printf(errno); 
     printf("ERROR: execvp failed\n"); 
     exit(-1); 
    } 
    else if(returnCode < 0) 
    { 
     fprintf(stderr, "fork failed\n"); 
    } 
    else 
    { 
     //i am the parent 
     printf("I am the parent"); 
    } 
    return 1; 
} 
+1

'숫자'는 무엇입니까? 나머지 프로그램은 어디 있니? (프로그램의 나머지 부분이 너무 큰 경우 더 작게 만들고 문제가 여전히 발생하는지 확인하십시오. [mcve]) – Ryan

+1

execvp는 실패하면'errno'를 설정합니다. – tkausl

+0

나는 execvp가 작동하지만 gdb가 나에게 seg fault를 주는지를 테스트하기 위해 빠른 프로그램을 작성했다. – Steven

답변

2

큰 문제는이 라인이다

char *args[] = {"./isEven", 12345, NULL}; 

argschar*의 어레이 여야 execvp로 전달. 인수로 12345을 가짐으로써 그것을 주소로 해석하게되고 유효한 주소가 될 것 같지 않습니다. 어쨌든, 그것은 당신이 전달하기를 원하는 것이 아닙니다. 따라서 :

char *args[] = {"./isEven", "12345", NULL}; 

number을 문자열로 변환해야합니다. 예를 들어 : 수정 된 예에서

int number = 12345; 
char num_str[256]; 
snprintf(num_str, sizeof num_str, "%d", number); 
char *args[] = {"./isEven", num_str, NULL}; 
execvp("./isEven", args); 
perror("exec"); 

, 당신은 errno를 인쇄하는 등 :

printf(errno); 

printf는 첫 번째 인수로 문자열을 기대하고 있기 때문 실패합니다. perror()을 사용하면 위와 같이 오류를 인쇄 할 수 있습니다.

+0

나는 하루 종일 일을하지 않는 이유를 알아 내려고 노력했다. – Steven

+0

만 감사합니다 !!!! – Steven

관련 문제