2013-11-19 1 views
3

У меня есть программа, в которой я пишу из нескольких дочерних процессов в канал, а затем пытаюсь прочитать все сообщения, написанные для каждого процесса, из каждого канала и распечатать их на экране , Со следующим кодом (в частности, цикл while с использованием системного вызова read для хранения сообщений в буфере buf), моя программа будет зависать и не выходить, а также не печатать все сообщения, отправленные в разные процессы.Что заставляет мою программу зависать и не выходить должным образом? (pipe, read system call, while loop)

for (i = 0; i < MAXP; i++) { 
    if(id == i) { 
     while(read(pfds[i][0], buf, sizeof(buf)) > 0) 
      printf("process%d has received a message from %s\n",i,buf);  
    } 
} 

Однако, с помощью следующего кода, программа завершает работу корректно, но не печатает все сообщения (так как они не все читали):

for (i = 0; i < MAXP; i++) { 
    if(id == i) { 
     nbytes = read(pfds[i][0], buf, sizeof(buf)); 
     printf("process%d has received a message from %s\n",i,buf); 
    } 
} 

Это мой код писать в трубы:

write(pfds[j][1],msg,9); // write the message to j pipe 

и сообщение:

sprintf(msg, "process%d", i); // create the message - 9 bytes (inc. null term) 
// the message is "process0" or "process1" ... through "process8" 

, который является 9 байт массив символов:

char msg[9]; 

Решение

for (j = 0; j < MAXP; j++) { 
    close(pfds[j][1]); // close write to j from i 
} 

ответ

5

Может б/с вы не закрыли трубу? если конец записи не закрыт, чтение будет продолжать висеть

Попытки добавления

close(pfds[j][1]); 

после того, как вы пишете сбщи к трубе

+0

Perfect. Я добавил цикл for для закрытия всех концов конвейера. Благодарю. –

+0

Рад это слышать! :) – JoeC

2

read(fd) (где fd это прочитать конец трубы) будет только возврат 0, когда все концы записи для трубы были закрыты.

Обратите внимание, что fork() -ing будет дублировать все дескрипторы открытых файлов. Итак, это:

int fd[2]; 
pipe(fd); 
if (fork() == 0) { 
    write(fd[1], "abc", 3); 
    close(fd[1]); 
} else { 
    char buf[100]; 
    while (read(fd[0], buf, 100) > 0) { 
    // ... 
    } 
} 

вызовет бесконечный цикл (потому что fd[1] все еще открыт в родительском процессе), в то время как это:

int fd[2]; 
pipe(fd); 
if (fork() == 0) { 
    write(fd[1], "abc", 3); 
    close(fd[1]); 
} else { 
    close(fd[1]); 

    char buf[100]; 
    while (read(fd[0], buf, 100) > 0) { 
    // ... 
    } 
} 

следует прекратить.

 Смежные вопросы

  • Нет связанных вопросов^_^