2016-11-22 3 views
0

exec에 심각한 문제가 있습니다. 목록 (execl)과 배열 (execv)의 두 옵션을 모두 사용해 보았지만 문제가 남아 있습니다. 내가 만들려고하는 기능을 제공 할 것입니다. 호출.잘못된 주소로 인해 실행이 실패 함

#include <unistd.h> 
#include <sys/types.h> 
void MyFunc(string aparams[],char* infile,char* outfile,int k,int points){ 

int mcount=3; 
char* offset= new char[5]; 
sprintf(offset,"%d",k); 
char* pntr=new char[5]; 
sprintf(pntr,"%d",points); 
char* *wparams=new char*[mcount]; 
for (int i = 0; i < mcount; i++) { 
    wparams[i] = new char[aparams[i].length() + 1]; 
    strcpy(wparams[i], aparams[i].c_str()); 
} 
char *cwd; 
cwd=(char*)malloc(255); 
getcwd(cwd,255); 
strcat(cwd,"/"); 
strcat(cwd,wparams[0]); 
cout << cwd << endl; 
execl(cwd,wparams[0],"-i",infile,"-o",outfile,"-f",offset,"-n",pntr,"-a",wparams[1],wparams[2],wparams[3],(char*) NULL);  

cout << "exec failed" << endl; 
perror("The problem in exec is:"); 
exit(3); 

}

aparams [0] 실행 파일의 이름을 가진 문자열을 포함,의는 "테스트"라고하자 .I 컴파일 -> g ++ Test.cpp에 -o 테스트 -> 그래서 내가 가진이 실행 파일. aparams의 다른 위치에는 테스트 프로그램에 대한 일부 인수가 들어 있습니다.

따라서 테스트를 실행하지 마십시오 (명령 줄에서 실행하면 문제가 없습니다). perror는 "문제는 exec입니다 : 잘못된 주소입니다."

나는 모든 인수 (const char *)를 캐스팅하려고했지만 아무 것도 변경되지 않았습니다. 인수에 문제가 있습니까? 또는 실행 파일의 문제입니까?

+0

'cout << cwd << endl;'print? – immibis

+0

파일 테스트가있는 예상 경로가 인쇄되었습니다. –

답변

2

mcount 3이므로, 세 요소 배열 wparams 포인트 - wparams[0], wparams[1]wparams[2].

그런 다음 wparams[3]에 액세스하면 유효하지 않으며 가비지가 포함되어 있습니다.

존재하지 않는 배열 요소에 액세스하려고 시도하지 마십시오.

+0

아 .. 잘 !!! 당신은 복잡한 것들을 생각하고 몇 시간을 상상할 수 없으며 코드를 실제로 확인했다고 생각합니다. 감사합니다. !! –

1

귀하의 문제는이 라인에 있습니다

execl(cwd, 
    wparams[0], 
    "-i", infile, "-o", outfile, "-f", offset, "-n", pntr, 
    "-a", wparams[1], wparams[2], wparams[3], (char*) NULL);  

당신은 [3], 존재하지 않는 wparams를 보내려고하고 있습니다! wparam 배열의 네 번째 요소이고 변수 mcount 초기화에서 배열 [3]으로 명시 적으로 정의했습니다.

관련 문제