使用sigusr1和sigusr2进行进程同步

时间:2013-12-02 19:35:23

标签: c signals producer-consumer

我正在编写一个生产者进程来写一个数据块到一个文件,一个消费者进程读取相同的块,但下面的代码卡在一个无限循环中,现在从我身边我认为我有一个消费者流程实施中的问题!!

void wakeup() { ; };
unsigned int sleep ( unsigned int timer ) 
{
   if (sigset(SIGALRM, wakeup)==-1) {
     perror("sigset"); return 1;
}

        (void)alarm( timer );
        (void)pause();
        return 0;
        }



int main(void) {
int fd, n, i, SomeInt, DataRead;
pid_t pid, ppid; 
char buf[4];
char *buf2;
int x=0;
if((fd=open("/tmp/data_file", O_APPEND|O_CREAT, 0640)) <0) exit(1);
sigset(SIGTERM,SIG_IGN);/* signal */   ; sigset(SIGINT,SIG_IGN); /* signal */ 
pid=fork(); 
switch (pid) { 
    case -1: { perror("FORK"); exit(1); } break;
    case 0: /* child process - Producer */ 
        sigset(SIGUSR1,wakeup);   
        sighold(SIGUSR1);       /* block / hold signals SIGUSR1 until sigpause*/ 

   FILE *file = fopen ("binary.txt", "r");
    while (!feof(file))
     {    n = (int)(getpid()%256); 
          srand((unsigned)n);
          sleep(rand() %5);
          for( x=0; x<=4;x++)
             fscanf (file, "", buf[x]);

         write(fd, buf,sizeof(buf)); 
        ppid=getppid(); 
        kill(ppid, SIGUSR2);   
        sigpause(SIGUSR1); 

      }

   fclose(file);
   fflush(stdin);


break;


default:    /* -parent code - Consumer */ 


                sigset(SIGUSR2,wakeup);
        sighold(SIGUSR2);       /* block / hold signals SIGUSR2 until sigpause*/ 
        for (i=0; i<=100; i++) { 
            /* sleep a random amount of time */ 
            n = (int)(getpid()%256); 
            srand((unsigned)n); 
            sleep(rand() %5);
            sigpause(SIGUSR2); /* pause(); */ 
            /* reads a character from file */ 
            read(fd, buf,sizeof(buf)); 
            fprintf(stderr,"Consumer PID=%d value=%d\n",getpid(),atoi(buf));
            kill(pid, SIGUSR1) ;
} 
break; 
} 
exit(0); 
}

1 个答案:

答案 0 :(得分:0)

  

下面的代码陷入无限循环,现在从我身边开始   我认为我在消费者流程实施中遇到了问题

生产者过程中存在一个问题,即您按如下方式编写了无限循环:

 while (!feof(file))
 {    ...
      for (x=0; x<=4; x++)
           fscanf(file, "", buf[x]);
      ...
 }

使用空格式字符串,您无法从文件中读取任何内容,因此永远不会到达feof(file)

您遇到的其他严重问题包括缩进“样式”(如AShelly提到的)和缺少错误检查(例如fopen()write())。