2015-09-04 161 views
1

我正在寫一個Unix程序,其中父進程分叉孩子p1.the父進程處理SIGUSR1。
子進程每1秒產生一個1到9之間的隨機數並使用管道發送給父親父接收該數字並將其打印到控制檯。當父進程接收到SIGUSR1信號時,他開始只打印奇數並且當收到的號碼是11時,他通過發送SIGTERM信號殺死孩子。父親等待狀態,然後終止孩子。孩子和父母之間的進程間通信C

#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 
#define READ_END 0 
#define WRITE_END 1 
volatile sig_atomic_t token; 
void handle_me(int signum) 
{ 
    token=0; 
} 
int main(int argc, char *argv[]){ 
     pid_t child1; 
     token=1; 
     int pipe1[2],status; 
     unsigned int bufChild1,bufChild2; 
     if (pipe(pipe1) == -1) 
     { 
      fprintf(stderr, "Pipe failed"); 
     } 
     child1 = fork(); 
     if (child1 < 0) 
     { 
      fprintf(stderr, "Fork Failed"); 
      return 0; 
     } 
     else if (child1 == 0) 
     { 
      printf(" child with pid %d\n", getpid()); 
      printf("The Parent pid is %d\n", getppid()); 
      while(1) 
      { 
        bufChild1 = (unsigned int)rand()%9 +1; 
        fprintf(stdout, "generated: %u\n", bufChild1); 
        close(pipe1[READ_END]); 
        write(pipe1[WRITE_END],&bufChild1,sizeof(bufChild1)); //write into the Parent 
        close(pipe1[WRITE_END]); 
      } 
     } 
     else 
     { 
      signal(SIGUSR1,handle_me); 
      printf(" Parent Process\n"); 
      while(!token) 
      { 
        close(pipe1[READ_END]); 
        read(pipe1[READ_END],&bufChild2,sizeof(bufChild2)); //write into the Parent 
        fprintf(stdout, "Received: %u\n", bufChild2); 
        close(pipe1[WRITE_END]); 
      } 
     } 
     wait(&status); 
     return 1; 
} 

我不知道如何實現這一條件時,父進程捕捉SIGUSR1信號,他開始只打印奇數當收到數是11,他通過發送SIGTERM信號殺死了孩子。

我使用了一個全局變量,如果SIGUSR1被父親捕獲,可以設置它。
如果有人能幫助我,我將非常感激。

回答

0

該程序包含一些錯誤。

  • 你忘了#include <signal.h>
  • 要使子進程每1秒鐘完成一次工作,必須將sleep(1)放入子進程的while循環中。
  • 孩子一定不能close(pipe1[WRITE_END]);否則它不能寫入父母。
  • 父母一定不能close(pipe1[READ_END]);否則它不能再讀取孩子。

我不知道如何實現這一條件時,父進程捕捉 的SIGUSR1信號,他開始只打印奇數...

您已經實施清除變量token當信號被捕獲,所以你可以改變父母的一部分到e。 G。

  close(pipe1[WRITE_END]); 
      while (read(pipe1[READ_END], &bufChild2, sizeof bufChild2) > 0) 
       if (token || bufChild2&1) 
        fprintf(stdout, "Received: %u\n", bufChild2); 

...當收到數是11,他通過發送 SIGTERM信號,殺死了孩子。

這將不會發生,因爲程序生成「之間1〜9一個隨機數」。

相關問題