2016-04-26 12 views
1

今日「殺す」ことは困難であるプログラムを作成する方法:C - 私はプロジェクトを与えられたと(以下貼り付けられている私のコード)は、次の操作を行うように言われた

ゴキブリを殺すために悪名高い難しいですが。あなたの仕事は、2つのプロセスで殺すことが非常に困難な ブザープログラムを作成することです。 基本的には:

  1. 父のプロセスをフォーク子と子のビープ音が鳴り父親が死亡した場合、子は父のフォークに別の1
  2. を死亡した場合にのみ、すべての0.5秒(usleep()をご確認ください)
  3. 父を見て子フォーク新しい子​​と2のいずれかがSTのメッセージを表示しSIGTERM

を受信した場合、どちらの停止父親

  • の役割を担っていますdoutまたはstderrが発生し、 すべてのメッセージにプロセスIDを追加して、どのプロセスにどのプロセスが発行されたかを知ることができます。

  • 私は最初の2つの問題を解決することができましたが、私は3と4を​​解決することができません。私は4のアイデアを幾分持ちますが、3から始めるべき場所を知りません。

    #define SLEEP_TIME 500000 
    static int keepGoing = 1; 
    int main() { 
        //signal(SIGALRM,(void (*))kill_child); 
        //useconds_t nap = .5; 
        int nap = SLEEP_TIME; 
        int status; 
        pid_t child_pid = -1; 
    
        while(keepGoing == 1){ 
         //signal(SIGTERM, sig_handler); 
         //signal(SIGCHLD, sig_handler); 
    
         if(child_pid != 0){//&& getppid() != 1){ 
          printf("Beep\n"); 
          printf("Parent: %d\n", getpid()); 
          child_pid = fork(); 
    
          pid_t deleted = wait(&status); //Get the ID of anything that was killed 
    
          if(deleted != -1){ 
           printf("\nChild %d was killed\n", deleted); //Print it out 
          } 
         }else if(getppid() != 1){ 
          printf("Child: %d\n", getpid()); 
          //childHandler(child_pid); 
          usleep(nap); //Sleep every .5sec 
         }else{ //The parent was killed 
          printf("\nParent was deleted %d is the new parent\n", getpid()); 
          child_pid = fork(); 
          pid_t deleted = wait(&status); //Get the ID of anything that was killed 
    
          if(deleted != -1){ 
           printf("\nChild %d was killed\n", deleted); //Print it out 
          } 
          sleep(5); 
         } 
    
        } 
        return 0; 
    } 
    
    +0

    ええと....プログラムが起動したらあなたは感染します。 – randominstanceOfLivingThing

    答えて

    0

    私はやや4のアイデアの持っているが、 3.上の任意の提案を開始する場所さえ分からないのですか?

    あなたのプログラムは、すでに4について3.

    を満たし:コメントを外し//signal(SIGTERM, sig_handler);をしてmain

    #include <signal.h> 
    void sig_handler(int signum) { kill(0, SIGKILL); } 
    

    を挿入します。

    kill(0, SIGKILL)は、呼び出しプロセス(父または子)のプロセスグループ内のすべてのプロセスを終了します。あなたのブザープロセスがプロセスグループを形成するので、bashのようなジョブ制御について知っているシェルでは、これがすべてです。灰のようなジョブ制御について知らないシェルでは、の最初にmain()を追加してください - Process groupsを参照してください。

    関連する問題