Почему этот код не читает данные из канала? - PullRequest
0 голосов
/ 08 марта 2011

Я смотрю на то, как писать каналы, и пытаюсь понять, как стандартная библиотека c раскрывает их в некоторых деталях. Я написал следующий код и ожидал, что результат будет

2 3
MAJOR ERROR
BYE

Однако вторая строка не отображается. Может кто-нибудь объяснить, почему это происходит?

int main()
{
    int rc;
    int p[2];
    char buffer[40];

    close(2);

    rc = pipe(p);
    printf("%d %d\n", p[0], p[1]);
    FILE* pipeWrite = fdopen(p[1], "w");
    fprintf(pipeWrite, "MAJOR ERROR\n");
    close(p[1]);

    rc = read(p[0], buffer, 40);
    buffer[rc] = '\0';
    printf("%s\n", buffer);
    printf("BYE\n");

    return 0;
}

Спасибо.

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

Вы пишете в канал, используя стандартные буферизованные операции ввода-вывода (fprintf(3)), но затем закрываете файловый дескриптор перед сбросом вывода. Добавьте fflush(pipeWrite); непосредственно перед вызовом close(p[1]); и посмотрите, соответствует ли ваш результат вашим ожиданиям. (Вы также можете использовать fclose(pipeWrite);, так как закрытие стандартного потока ввода-вывода также сбрасывает вывод.)

См. Справочную страницу setvbuf(3) для получения дополнительной информации о стандартных параметрах буферизации потока ввода-вывода.

0 голосов
/ 08 марта 2011

int main () {int rc;int p [2];буфер символов [40];

close(2);

rc = pipe(p);
printf("%d %d\n", p[0], p[1]);
FILE* pipeWrite = fdopen(p[1], "w");
fprintf(pipeWrite, "MAJOR ERROR\n");
close(p[1]);

rc = read(p[0], buffer, 40);
buffer[rc] = '\0';
printf("%s\n", buffer);
printf("BYE\n");

return 0; }

try

#include <stdio.h>
#include <unistd.h>

int main()
{
    int rc;
    int p[2];
    char buffer[40];

    close(2);

    pipe(p);
    printf("%d %d\n", p[0], p[1]);
    /*    FILE* pipeWrite = fdopen(p[1], "w");
      fprintf(p[1], "MAJOR ERROR\n");*/
    if((rc = write(p[1], "MAJOR ERROR\n", 12)) > 0)
      printf("Wrote to pipe\n");
    close(p[1]);

    if((rc = read(p[0], buffer, 40)) > 0)
      {    buffer[rc] = '\0';
    printf("%s\n", buffer);
    printf("BYE\n");
      }

    return 0;
}

один из многих способов снять кожу с кошки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...