#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. Обычно это то, что вы хотите, и вам не нужно делать ничего особенного между ними.