2014-11-01 98 views
0

任何人都可以告诉我为什么从管道读取时出现无限循环?我不明白我做错了什么。 message是我在主顶部定义的名称。 MESSAGE是我的结构名称。它甚至不打印出测试值。从管道读取时无限循环

if(manager_pid == 0) 
{ 
    printf("Hello? \n"); 
    if(close(pipe1[READING]) != 0) 
    { 
     printf("Error in closing pipe1 \n"); 
    } 
    if(close(pipe2[READING]) != 0) 
    { 
     printf("Error in closing pipe2 \n"); 
    } 
    if(close(pipe3[WRITING]) != 0) 
    { 
     printf("Error in closing pipe \n"); 
    } 
} 
i = 0; 
printf("work please \n"); 
//test_value = read(pipe3[READING], &boo, sizeof(echo)); 
//printf("test_value is %d \n", test_value); 

while(i < 10) 
{ 
    printf("In while \n"); 
    //printf("Hello?? \n"); 
    //test_value = read(pipe3[READING], &boo, sizeof(echo)); 
    //printf("test_value is %d \n", test_value); 
    //printf("Entering infinite loop \n"); 
    //printf("i is %d \n", i); 
    //nbytes = read(pipe3[0], array, 45); 
    //printf("nbytes is %d \n", nbytes); 
    //log_dat_fp = fopen(argv[2], "a"); 
    if(read(pipe3[READING], &message, sizeof(struct MESSAGE)) != -1) 
    { 
     printf("Entering if \n"); 
     log_dat_fp = fopen(argv[2], "a"); 
     printf("First if \n"); 
     time(&current_time); 
     //if(message.owner == 1 && (message.instruction == 'r' || message.instruction == 'R')) 
     if(message.instruction == 'r' || message.instruction == 'R') 
     { 
      if(message.owner == 1) 
      { 
       printf("message.owner == 1 with r or R \n"); 
       fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s", strtok(ctime(&current_time), "\n"), 
       message.owner, getpid(), message.instruction, message.id); 
       pclose(log_dat_fp); 
      } 
      else if(message.owner == 2) 
      { 
       printf("message.owner == 2 with r or R \n"); 
       fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s", strtok(ctime(&current_time), "\n"), 
       message.owner, getpid(), message.instruction, message.id); 
       pclose(log_dat_fp); 
      } 
      else 
      { 
       printf("You have junk \n"); 
      } 
     } 
     else if(message.instruction == 'u' || message.instruction == 'U') 
     { 
      if(message.owner == 1) 
      { 
       printf("message.owner == 1 with u or U \n"); 
       fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s %d", strtok(ctime(&current_time), "\n"), 
       message.owner, getpid(), message.instruction, message.id, message.value); 
       pclose(log_dat_fp); 
      } 
      else if(message.owner == 2) 
      { 
       printf("message.owner == 2 with u or U \n"); 
       fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s %d", strtok(ctime(&current_time), "\n"), 
       message.owner, getpid(), message.instruction, message.id, message.value); 
       pclose(log_dat_fp); 
      } 
      else 
      { 
       printf("You have junk \n"); 
      } 
     } 
     else 
     { 
      printf("manager can't read from pipe\n"); 
      exit(1); 
     } // read no good 
     if(message.instruction == 'r' || message.instruction == 'R') 
     { 
      if(message.owner == 1) 
      { 
       for(i = 0; i < 200; i++) 
       { 
        if(strcmp(storage, table[i].id) == 0) 
        { 
         match_flag = 1; 
         value = table[i].value; 
        } 
       } 
       if(match_flag == 1) 
       { 
        message.value = value; 
        message.owner = 0; 
        if(write(pipe1[WRITING], &message, sizeof(struct MESSAGE)) == sizeof(struct MESSAGE)) 
        { 
         log_dat_fp = fopen(argv[2], "a"); 
         time(&current_time); 
         fprintf(log_dat_fp, "Store Manager at time: %s sent message: %c %d %s %d\n", strtok(ctime(&current_time), "\n"), 
         message.instruction, message.owner, message.id, message.value); 
         fclose(log_dat_fp); 
        } 
        else 
        { 
         printf("error returning message to process 1"); 
         exit(1); 
        } 
       } 
       else 
        message.owner = 1; 
        if(write(pipe1[WRITING], &message, sizeof(struct MESSAGE)) == sizeof(struct MESSAGE)) 
        { 
         log_dat_fp = fopen(argv[2], "a"); 
         time(&current_time); 
         fprintf(log_dat_fp, "Store Manager at time: %s sent message: %c %d %s \n", strtok(ctime(&current_time), "\n"), 
         message.instruction, message.owner, message.id); 
         fclose(log_dat_fp); 
        } 

      } 
      else if(message.owner == 2) 
      { 
       printf("message.owner == 2 with u or U \n"); 
       fprintf(log_dat_fp, "Store Manager at time: %s received message %d %d %c %s %d", strtok(ctime(&current_time), "\n"), 
       message.owner, getpid(), message.instruction, message.id, message.value); 
       pclose(log_dat_fp); 
      } 
      else 
      { 
       printf("You have junk \n"); 
      } 

     } 
    } 
    else 
    { 
     printf("manager had pipe issues.\n"); 
     exit(1); 
    }// read no good 
    i++; 
    //log_dat_fp = fopen(argv[2], "a"); 
    printf("Each pass \n"); 
} 
+1

谁在写信给管道?是你父母的过程吗? – radar 2014-11-01 01:07:30

+0

您不检查部分读取或EOF。 – o11c 2014-11-01 01:07:58

+0

@RADAR另一个我的进程稍后将写'(pipe3r [写作],&消息,sizeof(结构MESSAGE))'。我试图找出为什么我先有一个无限循环。它看起来并不像是阅读。我的printf被完全忽略,所以我认为我对这个'printf(“test_value是%d \ n”,test_value);'有问题。 – cokedude 2014-11-01 01:16:51

回答

3

的POSIX read() 功能上EOF返回0,不为-1。既然你测试了错误的情况,你会得到一个无限循环。

注意,描述说:

当试图从一个空的管道或FIFO读:

  • 如果没有进程打开写管道,read()应返回0,表示档案结尾。

  • 如果某些进程打开的写作和O_NONBLOCK设置管道,read()将返回-1,并设置errno[EAGAIN]

  • 如果某些进程打开了写作的管O_NONBLOCK是明确的,read()应当续延至一些数据被写入或关闭管道时通过了对写开放管道的所有进程阻止调用线程。

阅读零个字节,因为没有要读取的字节是成功的。这就是EOF如何由read()表示,无论它是在文件还是其他任何类型的设备上。终端是一个特例; (在Unix上)control-D后,它们可能会返回0个字节,然后重试可能会返回其后键入的额外数据。很久以前,磁带驱动器有点类似。但是当read()返回0时,(暂时)没有更多数据要读取。对于一个管道来说,这意味着所有的编写者关闭他们的写入文件描述符。