LINUX.ORG.RU

Закрытие и открытие файлов

 


0

1

Всем привет. Недавно начал изучать Линукс в универе, нам дали задание открытие и закрытие файлов. Можете подсказать как работает данный механизм в этой ОС. Я предполагаю, что по умолчанию любые процессы могут обращаться к файлу. К примеру я создал текстовый файл и обращаюсь к нему посредством двух дескрипторов, причем первый я не закрыл, и почему-то второй != -1.

Вот код программы:

''' #define _CRT_SECURE_NO_WARNINGS

#include <fcntl.h>

#include <stdio.h>

#include <string.h>

#include<unistd.h>

#include<errno.h>

#include

using namespace std;

int main()

{

char buffer[100];

char s[100];

int len, cb, cbw1;

int hstdin = 0, hstdout = 1, fhandle, fhan2, fhan3;

char fname[] = "12.txt";



fhandle = open(fname, O_RDONLY | O_CREAT);



if (fhandle == -1)

{

	cout << strerror(errno);

	return 1;

}



fhan2 = dup(fhandle);

fhan3 = open(fname, O_RDONLY | O_CREAT);



if (fhan2 == -1 && fhan3 == -1)

	return 1;



lseek(fhandle, 10, SEEK_SET);

printf(" h1 = %d  h2 = %d h3 = %d\n", fhandle, fhan2, fhan3);

fflush(stdout);



cb = read(fhandle, buffer, 7);

write(1, buffer, cb);

write(1, "\n", 1);



cb = read(fhan2, buffer, 7);

write(1, buffer,cb);

write(1, "\n", 1);



cb = read(fhan3, buffer, 7);

write(1, buffer, cb);

write(1, "\n", 1);

read(0, buffer, 1);



close(fhandle);

} '''

Ответ на: комментарий от akk

Наоборот, это от сей там только printf и fflush, остальное на плюсах (глобальный using namespace std — это, конечно, блевотина, но сойдёт). А open/read и прочее там, очевидно, потому что таково задание — работа через функции ОС.

alegz ★★★★
()

Когда ты открываешь файл через open() - создаётся (где-то) структура данных об открытом файле, в которой есть ссылка на собственно файл и информация о позиции чтения/записи в нём. Если ты сделаешь dup() от полученного дескриптора, то тебе выдадут ещё один номер к той же самой структуре.

Если ты сделаешь второй open() к тому же файлу, то создастся вторая структура со ссылкой на тот же файл и своей (независимой от первой) позицией чтения. Файл можно открывать сколько угодно раз.

Иными словами:

1) есть сам файл, например твой 12.txt

2) есть структура открытого файла (где-то в ядре ОС, напрямую ты её не видишь), которыая в себе имеет ссылку на файл, их может быть много независимых для одного и того же файла, она создаётся когда ты вызываешь open()

3) есть файловый дескриптор (число, которое тебе возвращает open()) - их может быть много для одной и той же структуры с помощью dup()

firkax ★★★★★
()
Ответ на: комментарий от alegz

А open/read и прочее там, очевидно, потому что таково задание — работа через функции ОС.

А что, файловые потоки в крестах не «через функции ОС» сделаны?

akk ★★★★★
()

Можете подсказать как работает данный механизм в этой ОС

Если препод действительно дал вам задание по дескрипторам, но не рассказал что это и как работает, идите в деканат и говорите что вас учит некомпетентный человек. Если просто не поняли, спросить у препода. Алсо google://unix file descriptors

К примеру я создал текстовый файл и обращаюсь к нему посредством двух дескрипторов, причем первый я не закрыл, и почему-то второй != -1

Он не должен быть. Открытых дескрипторов на один файл может быть сколько угодно.

slovazap ★★★★★
()

Меня как то коллега просила найти репетитора по С для студента бауманки. Я слегонца офигел - чем К&R не угодил то? Оказывается книжки это сложно, выросло поколение которое не умеет читать и не умеет гуглить.

По базовым вещам надо сначала читать ман/вики/книжку а потом спрашивать на форуме, причем спрашивать какие то мелкие детали и частности которые не понял. И не потому что злые дяди не хотят объяснять - просто дяди будут пересказывать своими словами ман/вики/книжку и у них это получится хуже чем ман/вики/книжка, в итоге времени и сил на решение проблемы у Вас уйдет больше.

Основная задача вуза - научить Вас учиться самостоятельно. Не отлынивайте:-)

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)