ФАЙЛДЫ ЕНГІЗУ - ШЫҒАРУ




Презентация қосу
ФАЙЛДЫ ЕНГІЗУ-
ШЫҒАРУ
Iseek( ) көмегімен орналастыру
Әдетте, енгізу-шығару операциялары файлда сызықтық түрде жүреді және барлық
позициялау оқу және жазу операциялары нәтижесінде пайда болатын файл
позициясының анық емес жаңартуларына дейін азаяды. Алайда, кейбір қосымшалар
деректерге сызықтық емес , еркін қол жеткізу арқылы файл секіреді. Iseek () жүйелік
қоңырауы белгілі бір файл дескрипторының файл позициясының берілген мәніне
орнатуға арналған. Бұл шақыру файл позициясын жаңартудан басқа ешқандай
әрекеттерді орындамайды, атап айтқанда енгізу-шығаруға байланысты әрекеттерді
бастамайды.
#include
#include
off_t lseek (int fd, off_t pos, int origin);
Iseek () шақыруының әрекеті келесі мәндердің бірі бола алатын, origin шығу
аргументіне байланысты.
•SEEK_CUR - fd дескрипторының ағымдағы файлдық орны оның ағымдағы мәніне
және pos позициясына орнатылады. Соңғысы теріс, оң немесе нөлге тең болуы мүмкін.
Егер pos нөлге тең болса, онда файл позициясының ағымдағы мәні қайтарылады.
•SEEK_END - fd дескрипторының ағымдағы позициясы теріс, оң немесе нөлге тең
болатын ағымдағы файл ұзындығына және pos-қа орнатылған. Егер pos нөлге тең болса,
онда ығысу файлдың соңына орнатылады.
•SEEK_SET - fd дескрипторының ағымдық орны позицияға орнатылған. Егер pos
нөлге тең болса, онда ығысу файлдың басына орнатылады.
•Егер сәтті болса, бұл шақыру жаңа файл позициясына қайтарады. Қате болса, ол -1
қайтарады және errno-ға сәйкес мән береді.
Қазіргі уақытта lseek () көбінесе файлдың басына, файлдың соңына қатысты іздеу
үшін немесе файл дескрипторының ағымдағы орнын анықтау үшін қолданылады.
Файлдарды қысқарту

Linux-та файл ұзындығын қысқарту үшін екі жүйелік шақыруды қамтамасыз
етеді. Екеуі де әр түрлі POSIX стандарттарымен анықталады және талап етіледі.
Бұл шақырулар:
#include
#include
int ftruncate (int fd, off_t len);
және
#include
#include
int truncate (const char *path, off_t len);
Екі жүйелік шақырулар көрсетілген файлды len-де белгіленген ұзындыққа
қысқартады. Ftruncate () жүйелік шақыруы жазу үшін ашылуы керек fd файл
дескрипторында жұмыс істейді. Truncate () жүйелік шақыруы жолда көрсетілген
файл атында жұмыс істейді және бұл файл жазуға болатын болуы керек. Екі
қоңырау да сәтті болған кезде 0 мәнін қайтарады. Қате кезінде екі қоңырау –1
қайтарады және errno мәнін тиісті мәнге қояды.
Әдетте, бұл жүйелік қоңыраулар файлды ағымдық ұзындықтан азырақ
қысқарту үшін қолданылады. Егер шақыру сәтті болса, файл ұзындығы len
болады.
Мультиплексті енгізу-шығару
Мультиплекстелген енгізу-шығару қосымшаларға бірнеше
файл дескрипторларын параллель құлыптауға және олардың
кез келгені оқуға немесе жазуға дайын болғаннан кейін
хабарлама алуға мүмкіндік береді, сондықтан блок-
мультиплекс енгізу-шығару қосымшаның нақты өзегі болып
шығады.
Linux үш мультиплекстелген енгізу-шығару опцияларының
үш түрін ұсынады. Бұл таңдау (select) , сауалнама (poll) және
кеңейтілген сауалнама (epoll) арналған интерфейстер. Біз
мұнда алғашқы екі шешімді қарастырамыз. Соңғы нұсқа - Linux-
ке арналған жетілдірілген опция.
select()
Select () жүйелік шақыруы синхронды мультиплекстелген
енгізу-шығаруды енгізу механизмін ұсынады:
#include
int select (int n,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout);
Select ()-ке шақыру көрсетілген файл дескрипторлары енгізу-
шығаруды орындауға дайын болғанша немесе қосымша кідіріс
аралығы аяқталғанша бұғатталады.
Бірінші параметр n - бұл барлық топтардағы файл
дескрипторының ең жоғарғы мәні
Жүйелік шақыру poll()
Poll () -бұл System V-де мультиплексті енгізу-шығаруды қамтамасыз ететін
шешім. Ол select () - тегі кейбір кемшіліктерді өтейді, дегенмен select () әлі де
жиі қолданылады.
#include
int poll (struct pollfd *fds, nfds_t nfds, int timeout);
Бит маскаларына негізделген дескрипторлардың үш тобы бар тиімсіз әдісті
қолданатын select () шақыруынан айырмашылығы, poll() файл дескрипторлары
көрсететін nfds pollfd құрылымдарының бірыңғай массивімен жұмыс істейді.
Мұндай құрылым келесідей анықталады:
#include
struct pollfd {
int fd; /* файлдық дескриптор */
short events; /* бақыланатын оқиғаларды сұрау*/
short revents; /* қайтарылған оқиғалар */
};
poll() мен select() салыстыру
Жүйелік шақырулар poll() және select() шамамен бірдей тапсырманы орындайды,
бірақ бірнеше себептерге байланысты poll () select () қарағанда ыңғайлы.
• poll() пайдаланушыдан "файл дескрипторының максималды нөмірі плюс бір"
мәнін есептеуді және параметр ретінде жіберуді талап етпейді.
• poll() үлкен нөмірлері бар файл дескрипторларымен тиімдірек жұмыс істейді.
Select() көмегімен 900 мәні бар бір ғана файл дескрипторын қадағалаймыз делік. Бұл
жағдайда ядро 900-ге дейін берілген топтардың әрқайсысында әр битті тексеруі керек
еді.
• Select() - пен жұмыс істеу кезінде файл дескрипторларының топтары мән
қайтарылғаннан кейін қайта құрылады, сондықтан әрбір келесі қоңырау оларды қайта
іске қосуы керек. Жүйелік қоңырау poll () кірісті (events өрісі) және шығуды (revents
өрісі) ажыратады, бұл массивті өзгеріссіз қайта пайдалануға мүмкіндік береді.
Ішкі ядро ұйымдастырылуы

Бұл бөлімде біз Linux ядросының I / O-ны қалай жүзеге
асыратынын қарастырамыз. Бұл жағдайда бізді ядроның үш негізгі
ішкі жүйесі қызықтырады: виртуалды файлдық жүйе (VFS),
страницалық кэш және кейінге қалдырылған жазба. Бұл ішкі
жүйелер біртұтас, тиімді және оңтайлы I / O қамтамасыз етеді.
Виртуалды файлдық жүйе
Кейде виртуалды файл қосқышы деп те аталатын виртуалды
файлдық жүйе — бұл Linux ядросына файлдық жүйенің
функцияларын шақыруға және файлдық жүйенің деректерін
білместен, тіпті білуге тырыспай — ақ басқаруға мүмкіндік
беретін абстракция механизмі.
VPS қолданудың артықшылықтары көп. Кез-келген файлдық
жүйеден, кез-келген медиадан ақпаратты оқу үшін жалғыз
жүйелік қоңырау жеткілікті. Жеке утилита кез-келген файлдық
жүйеден кез-келген басқа жүйеге ақпаратты көшіре алады.
Барлық файлдық жүйелер бірдей тұжырымдамаларды,
интерфейстерді және жүйелік қоңырауларды қолдайды.
Барлығы жай жұмыс істейді және жақсы жұмыс істейді.,
Әмбебап жүйелік шақырулар - read (), write () және т.б. —
кез-келген қолдау көрсетілетін файлдық жүйеде және кез-
келген қолдау көрсетілетін ортада файлдарды басқара алады.
Страницалық кэш
Страницалық кэш - бұл жадтағы деректер қоймасы, олар дискіде
орналасқан файлдық жүйеден алынған және жақында жасалған. Дискіге
қол жеткізу өте баяу, әсіресе қазіргі процессорлардың жылдамдығымен
салыстырғанда. Арқасында сақтауға қажетті деректерді еске ядро
орындауы мүмкін, кейінгі сұраулар дәл сол деректер бойынша, қазірдің
өзінде емес-сөзінде саясатын дербес әзірлейді және бекітеді.
Страницалық кэштін жұмысы толығымен мөлдір болуы керек. Әдетте,
жүйелік бағдарламашылар өздерінің кодтарын парақтың кэшінің болуын
ескеріп, оны бағдарламаның пайдасына қолдана алатындай етіп
оңтайландыра алмайды. Мұндай артықшылықтарды пайдаланудың
жалғыз жағдайы бағдарламашы мұндай кэшті пайдаланушы кеңістігінде
өздігінен жүзеге асырады деп болжайды. Әдетте, бет кэшін оңтайлы
пайдалану үшін сізге тиімді кодты жазу қажет. Қайтадан пайдалануға
болады опережающим считыванием. Сериялық файлды енгізу-шығару
әрқашан еркін қол жетімділікке жақсырақ, дегенмен оны ұйымдастыру
әрдайым мүмкін емес.
Кейінге қалдырылған жазба

«Write () көмегімен жазу», буферлік жүйенің көмегімен ядро ​
жазуды тоқтатады. Процесс жазу сұрауын шығарған кезде,
мәліметтер буферге көшіріледі, ол сол кезден бастап лас болып
саналады. Бұл дегеніміз, жадтағы ақпараттың көшірмесі
дискідегі көшірмеден жаңа. Осыдан кейін жазу туралы өтініш
дереу қайтарылады. Егер сол файл фрагментіне жазуға тағы
бір сұраныс жасалған болса, буфер жаңа мәліметтермен
толтырылады. Егер бір файлға бірнеше жазу сұраныстары
жасалса, олардың барлығы жаңа буферлер жасайды.

Ұқсас жұмыстар
Екілік файлдар
СИ ОРТАСЫНДА ФАЙЛДАРМЕН ЖҰМЫС ЖАСАУ
Файлдардың типтері
Мәтіндік құжатты форматтау
Компьютерлік ақпаратты қорғау
Word редакторын тағайындау, іске қосу және онымен жұмыс істеуді аяқтау
Norton Commander
Си тілінде құрылған программаның құрылымы
Экономикалық ақпаратты өңдеу. Компьютердің программалық жабдықтар құрамы туралы мәліметтер
Файлды жазу
Пәндер