2016-11-22 6 views
0

私は4つまでの子プロセスを作成するプログラムを作ろうとしています。タスクを失敗した場合に複数の子プロセスにキル信号を送信するにはどうすればよいですか?

ブール検索(のchar *ファイル、のchar *ワード、int型の部分)

PS:あなたは無視することができ、それぞれの子は、目的のファイル内の特定の単語を見つけるために検索機能を使用します。検索機能とは何ですか正確にはここでの主な課題は、特定の子プロセスが成功したときに複数の子プロセスに信号を送信することです。

各子プロセスは、ファイルの特定のセクションを検索します。すなわち "foo" という名前のファイルcontaintsこと:

バー

タール

遠く

は、子プロセスは、文字列 "バー" を探しています。

子プロセスが文字列を見つけることに成功した場合、それは値0で終了しますが(の出口(0))、それ以外の場合は、文字列を見つけることの無い成功事例のでそのセクション全体を終了した場合、それが値で終了します1(出口(1))。

子が一度値0で存在すると(文字列の検索に成功)親プロセスは、他の子プロセスにkillシグナルを送信します。 4つの整数の配列を使用している私は、このコードでやった

#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 


int main() 
{ 
    pid_t p; 
    p=fork(); 
    int i; 
    int storage[4]; 
    for(i=0;i<4;i++) 
    { 
     p=fork(); 
     if(p==0) 
     { 
      storage[i]=getpid(); 
      open("testfile.txt",O_WRONLY); 
      if(search("testfile.txt","bar",i)) 
      { 
       storage[i]=1; 
       //exit(0); 
      } 
      else 
       //exit(1); 
     } 
    } 

    for(i=0;i<4;i++) 
    { 
     if(storage[i]!=1) 
      kill(stroage[i],SIGTERM); 
    } 
} 

が、それは子プロセスのIDが含まれています。

は、次のコードを考えてみましょう。 succeded子の場合は1に変更されます。その後、私はその特定のプロセスを除いて他のプロセスにkillシグナルを送りました。

私が書いたコードは正しいですか?もしそうなら、配列を使わずに出口値を使って信号を送るには?

+0

'storage'は自動保存期間を持つオブジェクトです。プロセス間で確実に共有されるわけではないので、あなたのアプローチは絶対に機能しません。 – EOF

+0

@ EOF私はそれを得ると思う、4つの子プロセスは、変数ストレージの右の自分のメモリフィールドを持っているでしょうか?それで、親が変数に値を持たないので、それはうまくいかないのですか?それをポインタとして使うとどうなりますか?それはそれを解決するだろうか? – Amine

+0

ポインタは、プロセス間で共有されるメモリを指す場合にのみこれを解決します。その場合、共有メモリへのアトミック性とアクセス順序を確保する必要があります。 – EOF

答えて

0

unixコマンドを実行して、配列を使用しない場合は、cmd()を使用して子プロセスIDのリストを取得できます。

また、fork()は、子プロセスIDを親に返します。親はそれを配列に格納できます。

関連する問題