блокировка fgetc: проблема с чтением из канала - PullRequest
3 голосов
/ 20 февраля 2011

Я хочу иметь возможность разветвлять процесс, чтобы у дочернего элемента и родительского элемента была двунаправленная связь с использованием каналов. Я создаю 2 канала и выполняю родительское чтение с конца 1-го канала и пишу в начало второго, и наоборот, но у меня возникают некоторые проблемы.

Здесь приведена краткая версия кода (проверка ошибок не указана)

void PlayGame(int in, int out, int first, int id){  
    FILE *inStream = fdopen(in, "r");
    FILE *outStream = fdopen(out, "w");

    if (first) fputc( id, outStream);
    while(1){
        int c = fgetc(inStream);
        printf("process %d has read %d\n", id, c);
        fputc( id, outStream);
    }
}


int main (void){
    int fd[2];
    int fd1[2];
    pipe(fd);
    pipe(fd1);

    pid_t pid = fork();

    if (pid == 0){
        PlayGame(fd[0], fd1[1], 0, 1);
        exit(0);
    }
    PlayGame(fd1[0], fd[1], 1, 2);
    exit(0);
}

Чего я хочу добиться, так это чтобы родитель записывал символ в канал, а потомок ждал, пока он не получит символ, а затем записывает свой ответ и снова ждет родителя. Что я тут не так делаю?

И родитель, и ребенок застряли при первом вызове

int c = fgetc(inStream);

1 Ответ

5 голосов
/ 20 февраля 2011

stdio (fputc и друзья) по умолчанию буферизуются, это означает, что fputc() на самом деле не записывает байт в канал, а сохраняет его в памяти для записи при последующей очистке буфера.

Вы можете сделать fflush(outStream) после fputc или setvbuf(outStream, NULL, _IONBF, 0); после fdopen, чтобы отключить буферизацию для этого файла.

...