читай (...): прочтёшь помнишь изменение? - PullRequest
0 голосов
/ 18 марта 2019
On success, the number of bytes read is returned (zero indicates end of file), and the file position is advanced by this number.

Это описание, которое я копирую из man 2 read, у меня есть вопрос к "этому положению файла в этом числе".

Что я хочу сделать в своем коде:следующее:

for (int i = 1; i < argc; i++) {
    if (read(pipe_fd[i-1][0], &contribution, sizeof(int)) == -1) {
        perror("reading from pipe from a child");
        exit(1);
    }

    if (i == argc){
        i = 1;
    }
}

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

Например, предположим, что я звоню read(pipe_fd[1][0], &contribution, sizeof(int)), из того, что я здесь понимаю, я знаю, что read прочитает sizeof (int) байтов из канала и каким-то образом использует вызов fseek или что-то подобное для перемещения sizeof (int) байты до следующей новой стартовой позиции.Но когда я перебираю цикл и снова меняю на чтение (pipe_fd [1] [0]), будет ли чтение помнить его последнюю начальную позицию?(что происходит после первого вызова read, новой стартовой позиции, которую я описал выше) Или read просто предполагает, что ничего не происходит, и читает из начальной стартовой позиции вместо новой стартовой позиции?

1 Ответ

0 голосов
/ 18 марта 2019

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

...