0

exec に重大な問題があります。list(execl) と array(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] には、実行可能ファイルの名前の文字列が含まれています。たとえば、「test」としましょう。コンパイルしました -> g++ test.cpp -o test -> この実行可能ファイルを取得しました。aparams の他の位置には、テスト プログラムのいくつかの引数が含まれます。

そのため、テストは実行されず (コマンド ラインから実行した場合は問題ありません)、perror に "The problem in exec is: Bad Address." というメッセージが表示されます。

また、すべての引数 (const char*) をキャストしようとしましたが、何も変わりませんでした。引数の問題ですか?それとも実行可能ファイルの問題ですか?

4

2 に答える 2

2

mcountは 3 なので、 、、の 3 つの要素をwparams持つ配列を指します。wparams[0]wparams[1]wparams[2]

次に、wparams[3]無効でガベージを含むものにアクセスします。

存在しない配列要素にアクセスしようとしないでください。

于 2016-11-22T01:58:40.497 に答える
1

あなたの問題はこの行にあります:

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

存在しない wparams[3] を送信しようとしています! これは array の 4 番目の要素でwparamあり、 variable の初期化で array[3] として明示的に定義しましたmcount

于 2016-11-22T02:02:10.843 に答える