@NikitaWeb

Почему считывается не по порядку?

Все происходит в Linux Mint
Первый файл записывает в текстовый файл введенный текст
#include <stdio.h> 
#include <fcntl.h>

int main()
{
	int hfile, length;
	char buf[100];
	printf("Введите текст:\n");
	hfile = open("text.txt", O_WRONLY|O_CREAT, 0600);
	if (hfile == -1)
	{
		printf("Error file");
		return 1;
	}
	length = read(0, buf, 100);
	write(hfile, buf, length);
	close(hfile);
	return 0;
}

Вторая программа открывает тот же файл (созданный перед этим первой программой) для чтения и хэндл, полученный при этом открытии, запоминает в 1-й переменной для хэндла. Используя этот хэндл, далее с помощью функции dup() получается новое значение хэндла для доступа к тому же файлу (2-й хэндл). Еще раз открывается тот же файл, запоминая 3-е значение хэндла. После получения действующих значений всех трех хэндлов программа позиционирует чтение для 10-й позиции файла от начала этого файла, используя при этом первый хэндл. Далее программа должна выводить числовые значения всех трех хэндлов на экран. Используя по очереди все 3 хэндла, из файла читаются по 7 символов и тут же эти три прочитанных текста выводятся на экран, каждая в своей строке.
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main()
{
	int fhandle1, nhandle, fhandle2;
	int len;	
	char buf[100];

	fhandle1 = open("text.txt", O_RDONLY, 0400);
	nhandle = dup(fhandle1);
	fhandle2 = open("text.txt", O_RDONLY, 0400);

	if (fhandle1==-1 || nhandle==-1 || fhandle2==-1)
	{
		perror("Error file");
		return 1;
	}
	lseek(fhandle1, 10, SEEK_SET);
	printf("handle 1: %d\n", fhandle1); 
	printf("handle 2: %d\n", nhandle); 
	printf("handle 3: %d\n", fhandle2); 
			
	len = read(fhandle1, buf, 7);
	write(1, buf, len);
	printf("\n");  
	len = read(nhandle, buf, 7);
	write(1, buf, len);
 	printf("\n"); 
	len = read(fhandle2, buf, 7);
	write(1, buf, len);
	printf("\n");  

	close(fhandle1);
	close(nhandle);
	close(fhandle2);
	getchar();
	return 0;
}

В файле введено : 5d90f0b132c40585177928.png
Результат работы второго файла: 5d90f0eb04cb7032455710.png
Почему результат вывода именно такой?
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему результат вывода именно такой?

Потому что если внимательно прочитать man dup, особенно вот эту часть:
After a successful return from one of these system calls, the old
and new file descriptors may be used interchangeably. They refer
to the same open file description (see open(2)) and thus share file
offset and file status flags; for example, if the file offset is modified
by using lseek(2) on one of the descriptors, the offset is also
changed for the other.

то окажется, что это поведение предписанное стандартом.
fhandle2 открыт независимо от fhandle1, поэтому у него все параметры состояния свои.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы