C: труба Как записать данные несколько раз на одну трубу? - PullRequest
0 голосов
/ 30 марта 2012
 //child process
    char buf[20];
    read(fd[0][0], buf, 20);
    printf("%s", buf);     

 //parent process
    write(fd[0][1], "12", 20);
    write(fd[0][1], "14", 20);
    write(fd[0][1], "15", 20);

 --output--
    12
    //then the program just exit. It cannot print out 14 and 15.

Могу ли я узнать, как можно решить эту проблему?Можно ли заставить дочерний процесс ждать, пока он действительно не прочитает данные из канала?

Я отредактировал свою программу.И он может читать все данные.Однако программа просто остановится.Это не может продолжать обрабатывать.Я думаю, что это остановится в дочернем процессе.

 //child process
    buf[6];
    int i;
    while ((i = read(fd[0][0], buf, 6)) > 0) {
         printf("%s", buf);     
    }

 //parent process
    write(fd[0][1], "12", 2);
    write(fd[0][1], "14", 2);
    write(fd[0][1], "15", 2);
    printf("done!\n");

 --output--
    121415done
  //The program just stopped in child process.

Ответы [ 3 ]

1 голос
/ 30 марта 2012
static const int BUF_SIZE = 4;
char buf[BUF_SIZE];

ssize_t read_bytes;
int i;

while ((read_bytes = read(fd[0][0], buf, BUF_SIZE)) > 0) {
    printf("BUF: {\n'");

    for (i = 0; i < read_bytes; ++i) {
        if (buf[i] != '\0')
            putchar(buf[i]);
    }

    printf("'\n} : EOBUF[%d]\n", nbytes);
}

if (read_bytes < 0) {
     perror("FAIL");
}

Редактировать: Работает плохо, если размер записи> записи данных, хотя. Мусор в конце.

0 голосов
/ 30 марта 2012

read будет читать до количество байтов, которое вы укажете. Это может читать меньше: все зависит от буферизации. Чтобы убедиться, что вы получите желаемое количество байтов, вам нужно использовать read в цикле:

//child process
#define MAXLEN 20
int total_read = 0, n;
char buf[MAXLEN + 1];
buf[MAXLEN] = 0;
p = buf;
while (total_read < MAXLEN) {
    n = read(fd[0][0], p, MAXLEN - total_read);
    if (n < 0)
        break; //error
    if (n == 0)
        break; //end of file
    total_read += n;
    p += n;
}
printf("%s", buf);
0 голосов
/ 30 марта 2012

Он прочитал данные из канала.Вы сказали «прочитайте до 20 байтов», и он это сделал (обратите внимание, что он тоже получил 17 мусора байтов, и что ваш родительский процесс считывал данные после конца 3-байтового буфера, пытаясь отправить их!).Если вы хотите, чтобы он считывал больше байтов, снова вызовите read ().

...