2017-02-13 8 views
1

ユーザーが特定のコマンドを入力したときにexecvpを使用してdemo.cppという新しいプログラムを起動するプログラムを作成する必要があります。ユーザーは入力形式を入力しますexecvpで新しいプログラムを実行できない

bgデモ単語int1 int2(単語bgの単語の関連性を無視し、私はコード内のcommandという文字列に格納します)。

これはコードです:

int main(){ 

char *argv[5]; 
argv[0] = new char[10]; 
argv[1] = new char[10]; 
argv[2] = new char[10]; 
argv[3] = new char[10]; 
argv[4] = nullptr; 


string command; 
pid_t PID; 

cin>>command; //store the string 'bg' 

cin>>argv[0]>>argv[1]>>argv[2]>>argv[3]; 

PID = fork(); 

if(PID<0){ 
    perror("Fork failed!"); 
} 

else if(PID==0){ 

    if(execvp("./demo.cpp",argv)<0) 
      printf("Failed"); 
    } 

wait(0); 

return 0; 
} 

コードプリントが "失敗" するたびに。私が考えることができるのは、execvpに渡される引数の形式に誤りがある可能性があることだけです。このコードとdemo.cppは同じフォルダに格納されています。

+2

:あなたは、実行可能ファイル(おそらくdemoそれを呼び出す)を構築し、そのをexecしする必要があります。/ demo.cpp'?それはC++ソースファイルですか? C++ソースファイルは実行できません。 – mch

+0

SOに関する同様の問題を検索してください。この質問を確認してください。 http://stackoverflow.com/questions/14301407/how-does-execvp-run-a-command – Laza

+0

@mch:私は愚かです!もちろん、C++ソースファイルをexecvpすることはできません。 –

答えて

2

まず、execvpには、指定された引数リストがNULLで終了する必要があります。ポイントはstd::stringへの入力を行い、その後、その後char型のポインタを取得することです

std::array<std::string,4> arguments; 
    std::cin>>arguments[0]>>arguments[1]>>arguments[2]>>arguments[3]; 
    char *argv[5]; 
    for (size_t i = 0; i<4; i++) { 
     argv[i] = const_cast<char*>(arguments[i].c_str()); 
    } 
    argv[4] = nullptr; 

:あなたはところで

char *argv[5]; // Not 4. 

    ... // input as before 

    argv[4] = nullptr; 

を必要とし、個人的に私はこれを変更します。これにより、バッファオーバーフローのリスクが回避されます。 (一方で、const_castはそれほど素晴らしいものではありませんが、実際には安全だと確信しています)

第2に、exec*のC++ソースファイルの名前を渡すことはできません! `は何

if(execvp("./demo",argv)<0) 

(あなたはまた、カレントディレクトリが実行可能ファイルを含むディレクトリであることを確認する必要があります。)

+0

私は最初の提案を試みましたが、まだ失敗しました。あなたの提案を組み込むために質問のコードを編集しましたが – Sim

+0

あなたは正しいです、エラーは私がソースファイルを渡していたことでした!なぜこのチュートリアルではこの詳細について言及していないのですか? – Sim

関連する問題