1

コマンドを受け取って実行する小さなシェル プログラムを作成しています。ユーザーが無効なコマンドを入力すると、if ステートメントは -1 を返します。コマンドが正しい場合はコマンドを実行しますが、コマンドを実行するとプログラムは終了します。その後のコード行を実行しないというのは、何が間違っているのでしょうか? execvp( command.argv[0], command.argv) を ls および cat コマンドでテストしたので、うまくいくと確信しています。これが私のコードです。

  int shell(char *cmd_str ){
  int commandLength=0;
  cmd_t command;
  commandLength=make_cmd(cmd_str,  command);
  cout<< commandLength<<endl;
  cout << command.argv[0]<< endl;
  if( execvp( command.argv[0], command.argv)==-1)
//if the command it executed nothing runs after this line
  {
    commandLength=-1;

}else
{
  cout<<"work"<<endl;
}

  cout<< commandLength<<endl;
   return commandLength;


}
4

3 に答える 3

6

manページからexecvp(3)

関数の exec() ファミリは、現在のプロセス イメージを新しいプロセス イメージに置き換えます。

したがって、現在のプロセス イメージはコマンドのイメージで上書きされます。fork+execしたがって、コマンドが子プロセスで実行され、現在のプロセスが親として安全に継続されるように、常に組み合わせを使用する必要があります。

軽いメモとして、私は絵で問題を説明したいと思います。絵は千の言葉を話すからです。攻撃を意図したものではありません:) :)

ここに画像の説明を入力

于 2012-04-13T14:39:18.623 に答える
0

@Pavan-私のようなニッチピッカーにとって、技術的には「現在のプロセスはなくなった」という声明は真実ではありません。同じプロセスで、同じ pid で、別のイメージ (コード、データなど) で上書きされているだけです。

于 2012-04-13T15:25:48.000 に答える
0

execのドキュメントから

関数の exec() ファミリは、現在のプロセス イメージを新しいプロセス イメージに置き換えます。このマニュアルページで説明されている関数は、execve(2) のフロントエンドです。(現在のプロセスイメージの置換に関する詳細については、 > execve(2) のマニュアルページを参照してください。)

プロセスを続行したい場合、これは使用したい関数ではありません。

于 2012-04-13T14:39:57.640 に答える