2012-10-25 4 views
0

루프가 끊어지기는했지만 fgets에서 멈추지 않습니다. process_P1은 파이프를 통해 inputHandler과 대화합니다. 문제는 inputHandlerprocess_P1이 쓰는 것을 멈출 때 깨닫지 못합니다 ... 'lalala'printf에 도달하지 못했습니다.fgets가 C에서 NULL을 반환하지 않습니다

void process_P1(char *argv[], int fd[2], pid_t child) 
{ 
    int bytes = 0; 

    static char bufferIn[BUFFER_SIZE]; 
    static char bufferOut[BUFFER_SIZE]; 

    char line[BUFFER_SIZE]; 

    // close reading end of pipe 
    close(fd[0]); 

    FILE *in = fopen(getInput(argv), "r"); 
    FILE *out = fdopen(fd[1], "w"); 

    if (in == NULL) { 
      sys_err("fopen(r) error (P1)"); 
    } 
    int ret = setvbuf(in, bufferIn, _IOLBF, BUFFER_SIZE); 
    if (ret != 0) { 
      sys_err("setvbuf error (P1)"); 
    } 

    if (out == NULL) { 
      sys_err("fdopen(w) error (P1)"); 
    } 
    ret = setvbuf(out, bufferOut, _IOLBF, BUFFER_SIZE); 
    if (ret != 0) { 
      sys_err("setvbuf error (P1)"); 
    } 

    while (fgets(line, BUFFER_SIZE, in) != NULL) 
    { 
      fprintf(out, "%s", line); 
      bytes += count(line) * sizeof(char); 
    } 

    // alert P2 to stop reading 
    //fprintf(out, "%s", STOP); 

    fclose(in); 
    fflush(out); 
    fclose(out); 

    printf("P1: file %s, bytes %d\n", getInput(argv), bytes); 

    // wait P2 ends 
    if (waitpid(child, NULL, 0) < 0) { 
      sys_err("waitpid error (P1)"); 
    } 
} 

void *inputHandler(void *args) 
{ 
    int ret; 

    static char bufferIn[BUFFER_SIZE]; 
    char line[BUFFER_SIZE]; 
    struct node *iterator; 

    int *fd = (int*)args; 

    close(fd[1]); 

    FILE *in = fdopen(fd[0], "r"); 
    if (in == NULL) { 
      sys_err("fdopen(r) error (P2)"); 
    } 
    ret = setvbuf(in, bufferIn, _IOLBF, BUFFER_SIZE); 
    if (ret != 0) { 
      sys_err("setvbuf(in) erro (P2)"); 
    } 

    while (fgets(line, BUFFER_SIZE, in) != NULL) 
    { 
    //  printf("%s", line); 
      iterator = firstArg; 
      while (iterator->next != NULL) 
      { 
        ret = sem_wait(&(iterator->sem)); 
        if (ret == 0) { 
          strcat(iterator->buffer, line); 
        } else { 
          sys_err("sem_wait error"); 
        } 
        ret = sem_post(&(iterator->sem)); 
        if (ret != 0) { 
          sys_err("sem_post error"); 
        } 
        iterator = iterator->next; 
      } 
      line[0] = '\0'; 
    } 
    printf("lalala\n"); 
    iterator = firstArg; 
    while (iterator->next != NULL) 
    { 
      ret = sem_wait(&(iterator->sem)); 
      if (ret != 0) { 
        sys_err("sem_wait error"); 
      } 
      iterator->shouldStop = 1; 
      ret = sem_post(&(iterator->sem)); 
      if (ret != 0) { 
        sys_err("sem_post error"); 
      } 
      iterator = iterator->next; 
    } 

    fclose(in); 

    return NULL; 
} 

답변

1

문제는 표시된 코드에없는 것 같습니다. 파이프에 대해 언급 했으므로 문제는 배관 관련 문제 일 가능성이 높습니다. 파이프의 한쪽 끝 부분에 dup2()을 입력하여 표준 입력 또는 표준 출력으로 만들었지 만 파일 설명자를 닫는 것을 잊었을 가능성이 큽니다. 복제했거나 다른 쪽 끝을 닫는 것을 잊었습니다. fgets()은 읽는 파이프에 쓸 수있는 프로세스가 없을 때까지 종료되지 않습니다. 여전히 읽는 프로세스가 파이프의 쓰기 끝을 열어 둔다면, 읽혀진 채로 머물러있어 뭔가 쓸 것을 기다린다.

배관 코드를 자세히 살펴보십시오. 한쪽 끝을 표준 입력 또는 표준 출력에 복제 한 후에 pipe()에 의해 반환 된 값을 모두 닫았는지 확인하십시오.

+0

고맙습니다. 내 프로그램에도 포크를 사용한다. 포크 중 하나가 파이프 설명자를 복제합니다. 이는 파이프가 하위 프로세스에서 열려 있음을 의미합니다. 이제 포크 앞에 파이프를 닫고 작동했습니다! –

관련 문제