read (…): запомнит ли read изменение?

#c #linux #pipe

#c #linux #канал

Вопрос:

 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], amp;contribution, sizeof(int)) == -1) {
        perror("reading from pipe from a child");
        exit(1);
    }

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

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

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

Ответ №1:

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