0

Linux で単純なシェルを作成していますが、コマンドをバックグラウンドで実行するのに問題があります。

これまでの私のコードは次のとおりです。

create command,argv and check if it is to be ran in the background &
enter this code:

if(strcmp(command,"cd")==0)
{        
  chdir(argv[1]);

}
else if(strcmp(command,"clr") == 0)
{
  if ((pid = fork()) == 0) 
  {        
     execvp("clear",argv);
  }
  wait(&status);
}
else
{      
   if ((pid = fork()) == 0)
{        
  execvp( prog, argv );        
}
  wait(&status);

}

command と argv は、ユーザーから取得したものです。

「&」がコマンドの最後の部分である場合、バックグラウンドでコマンドを実行する必要があります。私はすでにbgのブール変数でそれをチェックしました。しかし、WAITPID() 関数に問題があり、どこに行くのかわかりません。

4

1 に答える 1

1

あなたの問題は、waitpid()直接電話をかけるとブロックされ、プロセスが実際にはバックグラウンドで実行されていないことだと思います。これは 2 つの方法で処理できます。

  • 選択肢 1: 問題を回避します。fork を 1 回呼び出した後、子にもう一度 fork させます。孫にコマンドを実行させ、子を終了させます。親は以前と同じように子を待機しますが、孫はバックグラウンドでコマンドを実行しています。孫プロセスはプロセスによってリープされinitます。

  • 選択肢 2: 子が完了したという非同期通知に注意してください。子プロセスが終了すると、親プロセスがSIGCHLDシグナルを受け取ります。シグナルハンドラーにこのシグナルを認識させ、子を取得します。これには、同期ウェイターが実際にシグナル ハンドラーから同期通知を受け取るように、コードを再構築することが必要になる場合があります。次に、フォアグラウンドの子とバックグラウンドの子を区別し、フォアグラウンドの子に対してのみ同期通知を送信するシグナル ハンドラーのメカニズムが必要になります。

于 2013-02-28T22:26:19.107 に答える