труба не читается с - PullRequest
       5

труба не читается с

1 голос
/ 17 ноября 2010

Я работаю над кодом, связанным с каналами. Идея заключается в том, что у меня должен быть бесконечный цикл процесса и добавление данных в канал по мере его поступления (я проверяю это, читая файл и построчно переходя в цикл while).

Если я установлю другой процесс (тот, который читает канал) в спящий режим, чтобы прочитать весь файл, у меня не возникнет проблем, и я получу весь файл на выходе. Как только я удаляю спящий режим (так что теперь 2 процесса запускаются одновременно, когда 2-й процесс считывает информацию с конвейера по мере ее поступления), мой код переходит прямо в блок else моего кода ниже, и я никогда не вижу фактического вывода. Что я делаю не так?

close(pipe[1]);  
sleep(5);

while (1) {

  nbytes = read(pipe[0], buffer, 200);    

  if(errno != EWOULDBLOCK) {      
    printf("%s", buffer);     
  }

  else {
    printf("I am not blocked here\n");
    sleep(1);
  }
} 

Спасибо

1 Ответ

1 голос
/ 17 ноября 2010

Две вещи:

  1. Вы сделали трубу [0] неблокируемой? Это будет что-то вроде int nbio=1; ioctl(pipe[0], FIONBIO, &nbio);
  2. вы проверяете ошибку неправильно.
if(nbytes > 0) {
    /* you may need to null-terminate the input buffer prior to display */
    buffer[nbytes] = '\0';
    printf("%s", buffer);
}
else if(errno == EWOULDBLOCK) {
    printf("I am not blocked here\n");
    sleep(1);
}
else {
    printf("some other error occurred - if nbytes == 0, then it's EOF.\n");
}

вероятно, errno - это EWOULDBLOCK в первый раз, а затем не обновляется при успешном чтении, поэтому похоже, что EWOULDBLOCK снова.

...