Кіріспе

Операциялық жүйелердегі жүйелік ресурс идентификаторы. Unix және Unix-ке ұқсас компьютерлік операциялық жүйелерде файл дескрипторы (FD, сирек жағдайда fildes) – файл немесе құбыр немесе желілік сокет сияқты басқа кіріс/шығыс ресурсының процеске тән бірегей идентификаторы (дескриптор). Файл дескрипторлары әдетте теріс емес бүтін сандық мәндерге ие, ал теріс мәндер «мәні жоқ» немесе қате жағдайларын көрсету үшін резервтеліп қойылады. Файл дескрипторлары POSIX API-дің бөлігі болып табылады. Кез келген Unix процесінде (демондық процестерден басқа) үш стандартты POSIX файл дескрипторы болуы керек, олар үш стандартты ағынға сәйкес келеді:

Бүтін сан мәні Атауы Символдық тұрақты Файл ағыны 0 Стандартты кіріс 1 Стандартты шығыс 2 Стандартты қате

Шолу

Unix жүйесінің дәстүрлі іске асырылуында файл дескрипторлары ядромен сақталатын процеске арналған файл дескрипторлары кестесіне сілтеме жасайды, ол өз кезегінде барлық процестер ашатын файлдардың жүйелік кестесі – файл кестесіне сілтеме жасайды. Бұл кесте файлдың (немесе басқа ресурстың) ашылу режимін: оқу, жазу, қосымша жазу және басқа мүмкін режимдерді тіркейді. Сондай-ақ, ол негізгі файлдарды сипаттайтын inode кестесі деп аталатын үшінші кестеге сілтеме жасайды. Кіріс немесе шығыс операциясын орындау үшін процесс файл дескрипторын жүйелік шақыру арқылы ядроға жібереді, ал ядро процестің атынан файлға қол жеткізеді. Процесс файлға немесе inode кестелеріне тікелей қол жеткізе алмайды. Linux жүйесінде процесс ашқан файл дескрипторлары жиынтығына /proc/PID/fd/ жолы арқылы қол жеткізуге болады, мұнда PID – процесс идентификаторы. /proc/PID/fd/0 файл дескрипторы stdin, /proc/PID/fd/1 – stdout, ал /proc/PID/fd/2 – stderr болып табылады. Бұларға жылдам қол жеткізу үшін кез келген жұмыс істеп жатқан процесс /proc/self/fd және /dev/fd папкалары арқылы өзінің файл дескрипторларына қол жеткізе алады. Unix-ке ұқсас жүйелерде файл дескрипторлары файлдық жүйеде аталған кез келген Unix файл түріне сілтеме жасай алады. Бұл жүйелік файлдардан басқа, каталогтар, блок және таңбалық құрылғылар (сондай-ақ «арнайы файлдар» деп те аталады), Unix домендік сокеттері және атаулы құбырларды қамтиды. Файл дескрипторлары файлдық жүйеде әдетте кездеспейтін басқа да объектілерге, мысалы, анонимді құбырлар мен желілік сокеттерге сілтеме жасай алады. C стандартты кіріс-шығыс кітапханасындағы FILE дерек құрылымы Unix-ке ұқсас жүйелерде әдетте сол объект үшін төменгі деңгейдегі файл дескрипторынан тұрады. Бұл жалпы дерек құрылымы қосымша абстракцияны қамтамасыз етеді және файл тұтқасы ретінде белгілі.

Файл дескрипторларына операция жасау

Келесі тізімде қазіргі заманғы Unix-тәрізді жүйелерде файл дескрипторларымен орындалатын әдеттегі операциялар келтірілген. Осы функциялардың көпшілігі <unistd.h> атты бас файлда, ал кейбіреулері <fcntl.h> бас файлда жарияланған.

Болашақ операциялар

Көптеген қазіргі заманғы Unix-тәрізді жүйелерге және көптеген C кітапханаларына файл дескрипторларымен жұмыс істеуге арналған жаңа операциялардың сериясы қосылды, олар болашақ POSIX нұсқасында стандартталуы тиіс. "at" қосымшасы функцияның қосымша бірінші аргументті қабылдайтынын көрсетеді, ол салыстырмалы жолдарды шешу үшін пайдаланылатын файл дескрипторын ұсынады, ал "at" қосымшасы жоқ формалар ағымдағы жұмыс каталогына сәйкес келетін файл дескрипторын беруге тең болады. Осы жаңа операциялардың мақсаты – TOCTOU шабуылдарының белгілі бір түрінен қорғану.

Файл дескрипторлары мүмкіндіктер ретінде

Unix файлдық дескрипторлар көп жағдайда мүмкіндіктер сияқты жұмыс істейді. Оларды Unix домендік сокеттері арқылы процестер арасында sendmsg жүйелік шақыруды қолдану арқылы жіберуге болады. Бірақ, нақты жіберілетін нәрсе – файл офсеті, файл күйі және қол жеткізу флагтары сияқты өзгертіліп отыруға болатын күйі бар "ашық файл сипаттамасы". Бұл файлдық дескрипторларды мүмкіндіктер ретінде қауіпсіз пайдалануды қиындатады, себебі бағдарламалар бірдей ашық файл сипаттамасына қол жеткізгенде, олар оның офсетін өзгерту арқылы немесе бұғатталған немесе бұғатталмаған күйін өзгерту арқылы бір-бірінің жұмысына кедергі келтіре алады. Мүмкіндіктер жүйесі ретінде әзірленген операциялық жүйелерде мүмкіндіктің өзімен байланысты өзгертіліп отыруға болатын күй кездеседі деп айтуға болады. Unix процесінің файлдық дескрипторлар тізімі – C тізімінің бір мысалы.