2

C で子プロセスを実行していますが、一時停止してから同じ子プロセスを実行したいと考えています。私はこれが初めてなので、私の問題をより良い方法で説明する方法がよくわかりませんが、ここにショットがあります。

したがって、を使用して、別のプロセスが終了した後にプロセスを実行できることを知っていますwaitpid。しかし、待機しているプロセスの作成時に、待機しているプロセスが存在しない場合はどうなりますか。したがって、この場合、待機しているプロセスを一時停止し、待機しているプロセスが作成されて終了すると、待機しているプロセスを再度実行するように呼び出すことを考えています。それで、あなたはこれをどのようにしますか?繰り返しますが、私はこれに慣れていないため、これが適切な方法であるかどうかはわかりません。

編集:私がやろうとしていること

子プロセスを使用しexecvp()て並行してコマンドを実行しているため、 sequence がある場合sleep 1; sleep 1;、合計スリープ時間は 1 秒になります。ただし、並列化しようとする場合があります。その場合、何とかファイルに入力した後にファイルを読み取るとecho blah > file; cat < file;想定しています。したがって、私は完了するのを待たなければなりません。これにはさらに具体的な説明がありますが、通常、ファイルへの出力を伴うコマンドは、スクリプトの後半でファイルを読み取るコマンドによって待機する必要があると想定しています。catechoechocat

4

2 に答える 2

1

Linux の場合:特定の秒数後に目を覚ますことができるようalarm()に前に設定することができ、 EINTR を返す必要があるため、状況を知り、不正な動作をしたものを殺すことができます。もう 1 つの方法は、mutex を使用し、待機プロセスで次のようなブロックを使用することです。waitpid()waitpid()

if (pthread_mutex_trylock(&mutex) {
  sleep(some seconds);
  if (pthread_mutex_trylock(&mutex) {
    kill the process
  }
}

および監視されるプロセス:

エントリーポイント:

pthread_mutex_lock(&mutex);
do_stuff();
pthread_mutex_unlock(&mutex);
于 2012-02-03T20:43:00.373 に答える
0

waitpid()すべてのアプリケーション(プロセス)は、それ自体の直接の子でのみ待機できます。孫やより遠い子孫を待つことはできず、兄弟や祖先、または無関係のプロセスを待つことはできません。

アプリケーションがシングルスレッドの場合、子を作成するためwaitpid()に必要なことは何も行われないため、呼び出しの開始後に作成されるプロセスを待つことはできません。fork()

マルチスレッドプロセスでは、1つのスレッドで子が死ぬのを待機し、別のスレッドで子を作成することができます。たとえば、waitpid()スレッド1の呼び出しを時刻T0で開始し、スレッド2にT1で子を作成させ(T1> T0)、子をT2で死亡させるwaitpid()と、子の死体をピックアップします。 T3では、開始後に子が作成されましたwaitpid()が。

あなたのより高いレベルの問題はおそらく完全に扱いにくいものではありません。「シェルスクリプト」のコマンドラインを調べただけでは、特定のファイルにアクセスしているプロセスを特定することはできません。おそらくそれを使用しているものを見ることができます(ファイル名がコマンドラインに表示されるため)。ただし、名前がハードワイヤードされている他のプロセスが存在する可能性があり、コマンドラインを調べてもそれを確認することはできません。

于 2012-02-03T21:04:09.697 に答える