Коммерциялық емес акционерлік қоғам

АЛМАТЫ ЭНЕРГЕТИКА ЖӘНЕ БАЙЛАНЫС УНИВЕРСИТЕТІ

Компьютерлік технологиялар кафедрасы

 

 

 

ЖҮЙЕЛІК БАҒДАРЛАМАЛАУ 

 5В070400 – Есептеу техникасы және бағдарламалық қамтамасыз ету мамандығының студенттері үшін зертханалық жұмыстарға арналған әдістемелік нұсқаулар (1-бөлім)

 

 

 

Алматы 2011 

ҚҰРАСТЫРУШЫЛАР: Мусатаева Г. Т., Конуспаева А. Т., Байжанова Д. О. Жүйелік бағдарламалау. 5В070400 – Есептеу техникасы және бағдарламалық қамтамасыз ету мамандығының студенттері үшін зертханалық жұмыстарға арналған әдістемелік нұсқаулар (1-бөлім).– Алматы: АЭжБУ, 2011. – 26 б.

  

Әдістемелік нұсқаулар бағдарламалаудың тәжірибелік сұрақтарын қарастырып оқып жүрген 5В070400 – Есептеу техникасы және бағдарламалық қамтамасыз ету мамандығының студенттеріне арналған.

Әдебиеттер тізімі - 6 атау. 

 

Пікір беруші: физ-мат.ғыл.канд., доцент Ахметова М. А.

 

“Алматы энергетика және байланыс университеті” коммерциялық емес акционерлік қоғамының 2011 жылғы баспа жоспары бойынша басылады. 

 

© “Алматы энергетика және байланыс университеті” КЕАҚ, 2011 ж.

 

1 Зертханалық жұмыс. Жүйелік бағдарламалауды іске қосу және инициализациялау

 

Жұмыс мақсаты: жүйелік бағдарламалаудың үйлесімділігін көру және оны іске қосу.

Тапсырмалар

Linux операциялық жүйесін іске қосу және инициализациялау. Операциялық жүйенің пішінін үйлесімдіру.

Тапсырмаларды орындау үшін әдістемелік нұсқаулар

Windows бір-біріне ұқсамайтын жүйелерде, мобильді телефондар, қалталы құрылғылар, алып жүру компьютерлері мен кәсіпорын масштабындағы серверлер, жүйелік бағдарламалаудың негізгі амалдарына қол жеткізуді қамтамасыз етеді. Жүйелік бағдарламалаудың мүмкіндігін қазіргі операциялық жүйелерде басқаратын ең маңызды ресурстарды қарастырып сипаттауға болады.

Жады. Үлкен көлемді виртуалды адресті кеңістік, физикалық жады мен дискі немесе басқа дискілі жинайтын құрылғы арасында мәліметтерді ауыстыратын қолданушыға анық,  ОЖ бірыңғай немесе жазық (flat) басқарылады.

Файлды жүйелер. Жүйелік бағдарламалау файлдарға тура және тізбектеу мүмкіндігін беретін, деректі файлдар кеңістігін басқарады, сонымен қатар файлдармен және каталогтармен басқару амалдарын береді. Жүйелердің көбінде пайдаланылатын атаулар кеңістігі иерархиялық болып табылады.

Ресурстердің аталуы және орналасуы. Файлдардың ұзын, сипаттамалы аттары болуы мүмкін, сонымен бірге қабылданған деректер сұлбасы құрылғы сияқты нысандарға, және де синхронизация немесе үрдісаралық әрекеттесу нысандарына таралған. Деректі нысандардың орналасуы және олардың мүмкіндігін басқару, сонымен бірге жүйелік бағдарламалау құзыреті болып табылады.

Көп амалдылық. Жүйелік бағдарламалау асинхронды режимде тәуелсіз орындалатын бейімділігі бар, үрдістермен, лектермен және басқа да бірліктермен басқару амалдары болуы керек.

Әрекеттесу және синхронизация. Жүйелік бағдарламалау амалдар арасындағы ақпаратты ауыстыруды басқаратын және олардың жекеленген жүйелеріндегі  синхрондығын,  желілік жүйелердің бір-бірімен және интернетпен әрекеттесуін басқарады.

Қауіпсіздік пен қорғау. ОЖ ресурстерді рұқсат етілмеген немесе байқаусыз рұқсат пен жүйеге зардап тигізуінен икемді қорғау механизмін беру керек.

Microsoft Windows Win 32/Win64 API  тек осы ғана емес, сонымен қатар ОЖ көптеген басқа амалдарын қолдауын қамтамасыз етеді, және оларды Windows-тың  қатар версияларында жетімді қылады, олардың кейбіреулері қолданыстан шығып, ал кейбіреулері, АРІ-дың кейбір жиынасты функцияларын қолдап қана қояды.

Масштабталынуы. Кең жүйелі спектрге икемді жаңа версиялары үлкен көлемді оперативті жадыны  және жоғары сыйымдылықты  жадыда сақтау құралдарын пайдаланатын, өндірістік масштабты серверлерді есепке алуға болады.

Ықпалдау (интеграция).  Жүйенің  әрбір жаңа шығарылымы өзіне  мультимедиалық мәліметтерді немесе желісіз желіге қосылу, Web-қызметі немесе өздігінен икемделетін (plug-and-play) құралдарын  пайдалану сияқты қосымша технологиялық элементтерді ықпалдайды. Жалпылай, бұл технологияларды қарастыру бұл жұмыс шеңберінен шығады.

Қолдану қарапайымдылығы. Жүйенің әрбір жаңа шығарылымында жүйемен пайдалануды жеңілдететін  графикалық жұмыс столының немесе құралының сыртқы түрін жақсарту элементтері ешбір қиындықсыз көрсетіледі.

API жетілдірілуі. Өзінің өмір сүру уақытында API жаңа керемет мүмкіндіктермен толықтырылды.

Аталған десскрипторлар мен Windows GUI үшін жазылатын бағдарламада пайдаланылатын HWND және HDC дескрипторлары арасындағы ұқсастыққа қарамастан олардың арасында айырмашылық бар.

WaitForSingleObject WaitForSingleObjectEx WaitForMultipleObjects WaitNamedPipe

Сонымен қатар типтердің атын пайдалану ретін реттейтін бірнеше келісімділік бар.

API-ге қажет алдын-ала анықталынған мәліметтер типтерінің атаулары сипаттаушы болып табылады, сонымен қатар оларда бас әріптер пайдаланылуы керек. Ең көп таралған типтерге мыналар жатады.

BOOL (бір логикалық мәнді сақтауға арналған 32-битті объект ретінде анықталған)

HANDLE DWORD (универсалды 32-битті бүтін таңбасыз)

LPTSTR (8- немесе 16-битті символдардан тұратын жолға нұсқаушы) LPSECURITY_ATTRIBUTES

Көптеген басқа мәліметтер типтерімен сіздер материалдың берілу мезетінде танысасыз.

Алдын-ала анықталған  операцияларға нұсқаушы  аттарына * қолданылмайды және олар әртүрлі типтер нұсқаушылары арасындағы ерекшеліктерді көрсетеді, мысал ретінде  LPTSTR (TCHAR * ретінде анықталған) және  LPCTSTR (const TCHAR * ретінде анықталған).

Ескерту. TCHAR типі кәдімгі char символды типі арқылы бейнелей алады, екі байтты wchar_t типі.

Айнымалылар атын пайдалануға қатысты – функциялар прототиптерінде – сол сияқты белгілі-бір анықталған келісімдер бар. Сонымен IpszFileName аты «ұзын  жолға нұсқаушы, нольдік символмен аяқталатын», файлдың атын ұстайды. Бұл мысал "венгерлік нотация" деп аталатынды бейнелейді. Сол сияқты dwAccess — файлдарға мүмкіндік құқықты флагтерді ұстайтын екі сөз (32 биттік), мұндағы, “dw” “double world”- “екі сөз”.

Ескерту. Жүйелік функциялардың, константалардың, жалаулардың, қателер кодтарының және тағы басқалардың анықтамалары сақталатын тақырыптық (қосылатын) файлдарды қайталау қажет болады. Төменде келтірілген файлдарға ұқсас Micrrosoft Visual C++ және әдетте Program FilesX Microsoft Visual Studio.NET\Vc7\PlatformSDK\Include каталогында (немесе Program FilesXMicrosoft Visual Studio\VC98\Include  VC++6.0 жағдайында): ортаның бір бөлігі болып табылады.

WINDOWS.H (барлық басқа тақырыптық файлдарды қосатын мүмкіндікті қамтамасыз ететін файл)

WINNT.H WINBASE.H

Ақырында, оригиналды API Win32 басынан тәуелсіз интерфейс ретінде шығарыла бастағанына қарамастан, Windows-тың құрамына кіретін API Winl6-ге кері байланысы бар ретінде жобаланды.  Бұл программистердің көзқарасы бойынша ыңғайсыз.

Типтердің атауларында анахронизм элементтері кездеседі, мысал ретінде қарапайым 32 және 64 битті нұсқаушы болып табылатын «ұзын нұсқаушыға» сілтейтін LPTSTR және LPDWORD типтері. Басқа бір типтерге нұсқаушының бар болуы қажет емес. Кейде «ұзын» қосалқы бөлігі алып тасталынады және сол кезде LPVOID және PVOID типтері эквивалентті болып табылады.

Кейбір символды константалардың атауларында, мысалға WIN32_FIND_DATA  "WIN32" компоненті кіреді, бірақ сол константалар Win64-де қолданылады.

Кері сәйкестік туралы айтылған мәселе қазіргі уақытта өзінің актуалдығын жоғалтты, сонымен қатар ол өзінен кейін көптеген 16 разрядты функцияларын қалдырды. Бірақ олардың бірде біреуі бұл жұмыста пайдаланылмайды, дегенмен олардың маңыздылығы өте зор. Мысал ретінде OpenFile функциясын  келтіруге болады, аты бойынша ол файлдарды ашу үшін керек. Ал негізінде бар файлдарды ашу үшін тек CreateFile функциясын пайдалану керек.

 

Негізгі әдебиет: 2 [191-221], 3 [30-55].

Бақылау сұрақтары:

1) Пайдаланушы режимінде үрдістің жұмысы?

2) Ядро режимінде үрдістің жұмысы?

3) Linux операциялық жүйесін іске қосу қалай орындалады?

4) Конфигурациялау файлдары деген не?

 

2 Зертханалық жұмыс. Енгізу-шығаруды ұйымдастыру тәсілдері

 

Жұмыс мақсаты: файлға еркін қатынас құру. Енгізу-шығарудың стандартты кітапханасы.

Тапсырмалар

Енгізу-шығару құрылғыларының алгоритмдерінің жұмысын, функцияларын және құрылымдарын оқып-үйрену. Драйверлердің конфигурациялау файлдарын, енгізу-шығару стандартты кітапханаларын және енгізу-шығаруды қайта бағыттау командаларын оқу. Командалық интерпретатормен жұмыс жасау.

Тапсырмаларды орындау үшін әдістемелік нұсқаулар

Енгізу-шығару сұратулар аймағы. Құрылғы үрдісіне белгіленген және бекітілген, сонымен қатар, программаны орындау кезіндегі оларға туындайтын сұрату мәліметтері негізінде құрылады және енгізіледі.

Құрамы:

- арнайы басқарудың блок мекені;

- файлды басқарудың блок мекені;

- берілген  сұратуға жіберілетін сөздер немесе байттар саны;

- мәліметтердің қайдан берілетін жады мекені;

- енгізу-шығаруға арналған буфер мекені;

- жазба түріне көрсеткіш.

Құрылғыға сұрату аймағы. Жинақтағыш тегергіштерге  сұратуға қызмет көрсету үшін қажетті деректер жазылады.

Құрамы:

- файлдың аты бойынша енгізу-шығару программасы арқылы есептелінетін мәліметтердің физикалық мекені;

- осы мекенмен байланысты жады мекені;

- соңғы операцияны орындауы бойынша мәлімет.

Жазбаларды басқару аймағы. Бұғаттау ережесі және жазбалар бойынша блоктардың мекендетілуін бейнелейді, сонымен қатар бір жазбаға бірнеше рет қатынау кезіндегі үрдістерді бұғаттау ережесін алдын-ала жазу.

Жүйелік қызметке сұрату аймағы. Құрамы:

- үрдісті орналастыру жадысының картасы;

- енгізу-шығару құрылғылары және үрдіс мәліметтерінің блогы арасындағы тура беру үшін арналған жады картасы;

- оверлейлік аймақтар үшін арналған жұмыс кестесі.

Жады картасы ұғымына бөлектеніп берілген үрдіске байланысты жадының логикалық аймағы кіреді.

Үрдіс мәнінің құрылымы. Үрдіс мәнін мәтін арқылы анықталған күймен, пайдаланушының ауқымды айнымалылар мәнімен және ақпараттық құрылымдарымен, қолданылатын машиналық регистр мәнімен, есептің мекендік кеңістігінде және үрдістер кеңістігіндегі реттерінде сақталған мәндерімен, сонымен қатар берілген үрдіске қатысты есеп және ядро стектерінің құрамы бойынша анықтауға болады. Жүйенің операциялық мәтіні және оның ауқымды ақпараттық құрылымдары барлық үрдістермен бірге қолданылады, бірақ үрдістің мән мәтінінің құрамдас бөлігі болып табылмайды.

Үрдістің пайдаланушы мәні деп үрдістің адрестік кеңістігінде орналасқан кодты және мәліметтерді түсінуге болады. Динамикалық бөлінген жадыда орналасқан (мысалы   стандартты кітапханалық функциялар malloc, calloc және realloc) көмегімен барлық мәліметтер инициализацияланатын және өзгермейтін мәліметтерге (мысалы константалар), инициализацияланатын және өзгеретін мәліметтер (компилляция кезінде меншіктелетін барлық айнымалылар), инициализацияланбай өзгеретін мәліметтер (компилляция кезінде  бастапқы мәндері меншіктелмеген барлық статикалық айнымалылар), қолданушы стегі және мәліметтерге бөлінеді.

Орындалмайтын код және инициализацияланатын мәліметтер программалар файлы құрамын құрайды, олар үрдістің мән мәтінінде орындалады. Пайдаланушылар стегі қолданбалық режимдегі (user-mode) үрдістің жұмысы кезінде қолданылады.

Ядро мәні түсінігінде біріккен регистрлік мән мәтін және жүйелік мән мәтін түсінігі берілген. Үрдіс іске қосылған жағдайда жүйе үрдіс мәнінде (контексінде) орындалады. Егер жүйе ядросы басқа үрдісті іске қосуды жүзеге асыру кезінде ол  мән-мәтіннің ауысып қосуын орындайды, себебі басқа үрдіс өзінің мәнінде орындалуы керек. Мәннің қайта ауысу кезінде жүйе ядросы алдыңғы ақпаратты сақтайды, өйткені ол бірінші үрдіс мәнінде қайта оралып оны аяқтауға мүмкіндік береді.

Үрдіс мәні құрамында үрдіске бөлінген есептің мекен кеңістігі және үрдістің құрамына кіретін аппараттық регистр және деректер ядросының құрылымы болады. Пайдаланушы мән-мәтіні командалардан және үрдіс деректерінен, есеп стегі және бірігіп қолданатын виртуалды үрдіс мекенінің жады кеңістігінен  тұрады.

Үрдістің мәні пайдаланушы мен ядро мәнінен тұрады.

Параметрлер

nStdHandle параметрі келесі мәндердің біреуін қабылдау керек:

STD_INPUT_HANDLE

STD_OUTPUT_HANDLE

STD_ERROR_HANDLE

Стандартты құрылғылар ретінде әдетте консоль мен пернетақта тағайындалады. Стандартты енгізу/шығаруды басқа құрылғыларға қайта бағыттайды.

GetStdHandle функциясын шақыру стандартты құрылғылар дескрипторын жаңадан құруға немесе бар дескрипторды қайталауға әкелмейді. Аргумент ретінде сол бір құрылғының сілтеуімен тізбекті шақырулар дескриптордың сол бір мәнін қайтадан қайтарады. Стандартты құрылғының дескрипторын жабу бұл құрылғыны кейінірек қолдануға қол жетпестей қылады. Осы себеппен төменде келтірілген мысалдарда стандартты құрылғының дескрипторын жиі ашамыз да, бірақ  жаппаймыз.

BOOL SetStdHandle ( DWORD nStdHandle, hHandle)

Қайтарылатын мән: сәтті орындалу жағдайында - TRUE, басқаша - FALSE.

SetStdHandle функциясының nStdHandle параметрінің жіберілетін мәні GetStdHandle функциясындағы жағдайлар сияқты болып табылады. hHandle параметрі стандартты құрылғы ретінде тағайындалатын ашық файлға сілтейді.

Стандартты енгізу/шығарудың қайта бағыттау әдістерінің бірі болып SetStdHandle және GetStdHandle функцияларын ретпен шақыру болып табылады. Бұл дескриптордың алынған нәтижелері келесі енгізу/шығару операцияларында қолданылады. Консольді енгізу мен (пернетақта) консольді шығаруға қолжеткізу жолдарын көрсету үшін кейінге сақталған екі атау қарастырылған: "CONIN$" және "CONOUT$". Стандартты енгізу, шығару және қателерді шығару құрылғыларының рөлі алғашқыда консоль апарылады. Бірақ консольді енгізу/шығару операциясы ретінде қолдануға болады, стандартты құрылғылардың қолданылуын талап ететіндер қайтадан бағытталады; ол үшін CreateFile функциясын шақырып, "CONIN$" және "CONOUT$" файлдар дескрипторын ашу керек.

UNIX-та стандартты енгізу/шығару үш әдістің біреуімен бағытталуы мүмкін.

Бұл әдіс жанама болып табылады және dup функциясы файл дескрипторын аз қолжеткізулік нөмірмен қайтаратындығына негізделеді. Егер сіз стандартты енгізуді (файлдық дескрип­тор 0) f d_redirect суреттелген ашық файлға қайта тағайындағыңыз келсе, онда келесі кодты жазуға болады:

close   (STDIN_FILENO);

dup   (fd_redirect);

Келесі әдісте dup 2 функциясы қолданылады, ал үшінші әдісте параметр мәнінде F_DUPFD-ты қолданып, қиын жүктелген fcntl функциясының шақырылуы жорамалданады.

 Консольді енгізу/шығару операциялары ReadFile және WriteFile функциялары көмегімен орындала алады, бірақ бұған арналған ReadConsole және WriteConsole функцияларын қолдануға да болады. Бұл функциялардың басты ерекшелігі мынада: олар байттармен емес, талдап қорытылған рәміздермен (TCHAR) күрделі іс-әрекеттерді орындайды және де SetConsole-Mode функциясымен орнатылатын консольдің ағымдағы режимдерімен келісімде рәміздерді өңдейді.

BOOL SetConsoleMode (HANDLE hConsoleHandle, DWORD fdevMode)

Қайтарылатын мән: функция сәтті аяқталса - TRUE, басқаша - FALSE.

hConsoleHandle —құрылғы тек ақпаратты енгізуге ғана арналған болса да, GENERICWRITE қолжеткізу құқығымен құрылу керек болатын консольдің енгізу буферінің немесе дисплей буферінің дескрипторы.

fdevMode параметрі рәміздерді өңдеу әдістерін береді. Құрамындағы әр жалаушаның атында берілген жалауша-енгізуге (input) немесе шығаруға  (output) қатысты екендігін көрсететін компонент бар. Төменде әдетте қолданылатын бес жалауша келтірілген, оның үстіне олар үндемей орнатылады.

ENABLE_LINE_INPUT — оқылу функциясынан қайтарылуы (ReadConsole) күймеше қайтарылу рәмізінің оқылуынан кейін болады.

ENABLE_ECHO_INPUT — экранда енгізілген рәміздердің жаңғырық-көрсетілуі.

ENABLE_PROCESSED_INPUT — бұл жалаушаның орнатылуы басқарылатын рәміздердің бір орынға қайтарылуы, күймешенің қайтарылуы және жаңа жолға көшуі жүйемен өңделуге әкеледі.

ENABLE_PROCESSED_OUTPUT —  бұл жалаушаның орнатылуы басқарылатын рәміздердің бір орынға қайтарылуы, табуляция, дыбыстық сигналдың берілуі, күймешенің қайтарылуы және жаңа жолға көшуі жүйемен өңделуге әкеледі.

ENABLE_WRAP_AT_EOL_OUTPUT — экрандағы келесі жолға секіру рәміздердің әдеткі шығарылуы кезінде және жаңғырық-көрсетілуі кезіндегі енгізу үрдісі.

SetConsoleMode функциясының сәтсіз аяқталуы жағдайында ағымдағы режим өзгеріссіз қалады және функция FALSE мәнін қайтарады. Әдеттегідей, қате нөмірін алу үшін GetLastError функциясын қолдану керек. ReadConsole және WriteConsole функциялары  ReadFile және WriteFile функцияларына сәйкес болады.

Бұл параметрдің функциялары ReadFile функциясының параметрі сияқты болады. Екі параметрдің де мәндері санауға қажетті (cchToRead) және іс жүзінде саналған (lpcchRead) рәміздер санымен байланысты байттар емес, талдап қорытылған терминдерде өрнектеледі, ал lpReserved параметрінің мәні NULL тең болуы керек. Қалған жағдайларда кейбір функцияларда кездесетін lpReserved-ке сәйкес кейінге сақталған алаңды қолдануға болмайды. WriteConsole функциясының параметрлерінде де сондай мағына бар және олар қосымша түсіндіруді қажет етпейді.

Әр үрдіске әр уақыт сәтінде тек қана бір консоль тағайындалуы мүмкін. Осыған дейін қарастырып келген типтің қосымшаларына консоль әдетте инициализация сатысында беріледі.  Бірақ басқа, мысалы, GUI-қосымшалары және бас компьютерлер жағдайларында бағдарламаның күйі туралы ақпаратты немесе кейінге қалдырылатын ақпаратты шығаратын жеке консольді алу қажеттілігі туындауы мүмкін. Бұл мақсатта параметрлері жоқ екі қарапайым функцияларды қолдануымызға болады:

BOOL FreeConsole (VOID) BOOL AllocConsole   (VOID)

FreeConsole функциясы оның консолінен үрдісті өшіреді, сол уақытта AllocConsole функциясы берілген үрдіске тиісті стандартты ақпаратты енгізу, стандартты ақпаратты шығару және қателер туралы хабарламаларды шығару дескрипторларымен қауымдасқан жаңа консольді құрады. Егер консоль бұл үрдісте бар болса: онда AllocConsole функциясы қатемен аяқталады; бұны болдырмас үшін алдын ала FreeConsole  функциясын шақырып отыру керек. 

 

Ескерту

Windows-та GUI-қосымшаларында үндемеушілікпен орындалатын консольдары болмайды және олар оны консольге шығару үшін WriteConsole немесе printf функцияларын қолданбастан бұрын алулары керек. Бас компьютер жағындағы үрдістер консольдерсіз бола алады. Консольдерсіз үрдістерді құру туралы жұмыста айтылады.

Сонымен қатар меңзегіш орнын орнатуға, шығарылатын рәміздердің атрибуттарын беруге (мысалы, түс) және т.б. арналған консольді енгізу/шығарудың көптеген басқа функциялары да бар.

 

Негізгі әдебиет: 1  [237-275], 3 [270-276], 2 [129-147].

Бақылау сұрақтары:

1) Құрылғы драйвері дегеніміз не?

2) tset командасының функциясы?

3) Құрылғы файлдары қай каталогта сақталады?

4) Драйверлердің конфигурациялау файлдары?

5) Құрылған файлдар қай командалар арқылы құрылады?

 

3 Зертханалық жұмыс. Файлдық жүйенің базалық функциялары

 

Жұмыс мақсаты: файлдарға қатынас құру. Файлдармен және каталогтармен жұмыс істеу. Файлдар мен каталогтарды қорғау.

Тапсырмалар

Файлдық жүйенің базалық функцияларын және файлдармен және каталогтармен жұмыс жасайтын командаларды оқып-үйрену. Файл атрибуттары, chmod командасымен жұмыс жасау – файлдарға қатынау құқығын өзгерту. Файлдармен каталогтарды қорғау.

Тапсырмаларды орындау үшін әдістемелік нұсқаулар

Windows операциялық жүйелерінде файлдың толық аты бос символмен аяқталатын жолмен көрсетіледі. Мұндай жолдың ұзындығы max_path символдан аспайды. FAT32 және NTFS файлдық жүйелері 255 символға дейінгі толық файл аттарын кіргізе алады. Мұндай аттар ұзын деп аталады. MSDOS операциялық жүйесінде қолданылған FAT16 файлдық жүйесі ұзындығы 8 символға қосымша 3 символ файл кеңейтілуіне кететін файлдық аттарды көрсетеді. Файлдың толық аты әр біреуі символмен бөлінетін компоненттен тұрады. Файлға өту үшін қолданылатын ережелер:

- Каталог пен файл аттары символдардан тұрмауы керек, яғни 0-ден 31-ге дейінгі диапазондағы  ASCII кодтарынан (олар қызметтік символдар).

- Каталог пен файл аттары  <, >, :, “, |, \, / символдарын қамтымау керек.

- Каталог аттары мен файлдар 128-ден 255-ке дейінгі символдардан тұра алады.

Ағымдағы каталогты компонент ретінде көрсету үшін . (нүкте) символы қолданылады.

Аналық каталогты ағымдағы каталог үшін компонент ретінде көрсету үшін .. символы қолданылады.

Компонент ретінде құрылғылар атын қолдануға болмайды, мысалы aux, con, lptl, prn.

Файлдың жасалуы мен ашылуы

Жаңа файл немесе бар файлды ашу үшін CreateFile функциясы қолданылады, оның келесі прототипі бар:

HandleCreateFile (LPCTSTR lpFileName,         // файл аты

DWORD dwDesiredAccess,                       // рұқсат ету тәсілі

DWORD dwShareMode,                                     // бірігіп қолдану режимі

PSECUTITY_ATTRIBUTES IpSecurutyAttributes

// қорғау атрибуттары

DWORD dwCreationDisposition

// файл жасау немесе ашу

WORD dwFlagsAndAttributes                    // жалаулар мен атрибуттар HANDLE hTemplateFile                                  // файл атрибуттары

Сәтті аяқталған жағдайда функция жасалынған немесе ашылған файлдың дескрипторын қайтарады, ал сәтсіз аяқталса invalid_handle_value мәнін IpFile Name CreateFile параметрінде символдық жолға нұсқау көрсетіледі, онда жасалынатын немесе ашылатын файлдың толық аты көрсетіледі. Егер файлдың толық аты көрсетілмесе, файл берілген атымен жасалынады немесе ағымдағы каталогтан ізделінеді. dwPesiredAccess параметрі файлға өту тәсілін береді және келесі мәндердің кез келген комбинациясын қолдана алады:

о — қосымша тек қана құрылғы атрибуттарын анықтай алады;

generic_read — мәліметтерді тек файлдан ғана оқуға рұқсат етеді;

generic_write — мәліметтерді тек қана файлға жазуға рұқсат етеді.

Бұл файлға өтудің жалпы режимі. Басқа да режимдер бар, өтуге байланысты файлды қорғау атрибуттарын анықтауда берілген. dwshare Mode параметрі файлға өтудің бірлескен режимін береді. Егер бұл параметрдің мәні нөлге тең болса, онда файл бірден тез өте алмайды. Әйтпесе dwshare Mode параметрі келесі мәндердің кез келген комбинациясын қолданады:

file_share_read — файл тек бірнеше программалармен бірлесіп оқу үшін қолданыла алады;

file_share_write — файл тек бірнеше программалармен бірлескен жазба үшін қолданыла алады;

file_share_delete — файл бірнеше программалармен қолданыла алады, тек олардың әрбіреуінің бұл файлды жоюға рұқсаты болуы керек.

Соңғы мәндер тек Windows операциялық жүйелерінде қолданылады. ipsecurutyAttributes файл қорғауының атрибутын береді. dwCreationDisposition параметрі әрекетті береді, файлдың ашылуы мен жасалынуында орындалатын. Бұл параметр келесі мәндердің біреуін қабылдай алады:

create_new — жаңа файл ашу, егер мұндай атпен файл бар болса, онда функция сәтсіз аяқталады;

create_always — жаңа файл ашу, егер мұндай атпен файл бар болса, онда ол жойылады да жаңа файл ашылады;

open_existing — бар файлды ашу, егер файл берілген атпен жоқ болса, онда функция сәтсіз аяқталады;

open_always — файлды ашу, егер берілген атпен файл жоқ болса, жаңа файл ашылады;

truncate_existing — файлды ашу және оның мазмұнын жою, егер файл берілген атпен жоқ болса, онда функция сәтсіз аяқталады.

Соңғы үрдіс бойынша dwDesiredAccess параметрінде GENERIC_WRITE жалауын орнату керек. dwFiagsAndAttributes параметрінде жасалынатын немесе ашылатын файлдың жалауы мен атрибуттары болу керек. Файл атрибуттары келесі мәндердің комбинациясын қабылдайды:

file_attribute_archive —қызметтік ақпараттан тұратын архивтік файл;

file_attribute_encrypted — шифрленген файл;

FIl E_AT TRI BUT E_h IDD EN — көрінбейтін файл;

file_attribute_normal — өзге атрибуттары жоқ қарапайым файл;

file_attriвитe_not_content_indexed —мазмұны индекстелмеген файл;

file_attribute_offline —жадыда орналасқан көмекші файл;

FILE_ATTRIBUTE_READONLY — файлды тек оқуға ғана болады;

file_attribute_system —операциялық жүйемен қолданылатын файл;

file_attribute_temporary — файл мәліметтерді уақытша сақтау үшін қолданылады.

Кейбір файл атрибуттары туралы ескертулер айтсақ, шифрленген файлда file_attribute_system атрибуты болмайды. file_attribute_normal атрибуты басқа комбинациясыз, тек өзі қолданылуы керек. dwFiagsAndAttributes параметрінде келесі басқарушы флагтардың кез келген комбинациясы орнатылуы мүмкін:

file_flag_write_through — кэштауды қолданбай, дискіге мәліметтердің жазылуы;

file_flag_overlapped — оқу және жазу операцияларының асинхронды орындалуын қамтамасыз етеді;

file_flag_no_buffering — файлға өту кезінде буферлеуді қолданбау;

file_flag_random_access — программа жазбаны файлдан кездейсоқ таңдауды ұсынады;

file_flag_sequential_scan — программа файлды кезектеп сканерлейді;

file_flag_delete_on_close — файлдың барлық дескрипторлары жабық болғанда файл жойылады;

file_flag_backup_semantics — резервтік файл;

file_flag_posix_semantics — файлға өту  POSIX стандартымен жүзеге асырылады;

file_flag_open_reparse_point — файлға өту кезінде жүйелік фильтр қолданылады;

Ескерту, file_flag_backup_semantics флагы тек Windows NT/2000 операциялық жүйелерінде қолданылады.

Файлдың ашылуы мен жойылуы

Файлға өтуді жабу үшін, басқа кез келген объект ядросының жабылуы үшін CloseHandie функциясы қолданылады, оның жалғыз параметрі боп ашық файлдың дескрипторы саналады. Файлдың толық жойылуы үшін дискіден келесі прототипі бар функция қолданылады:

BOOL DeleteFile(LPCTSTR lpFileName  // файл аты);

lpFileName параметрі файлдың толық жолын көрсететін нұсқаушы боп табылады. Сәтті аяқталу кезінде функция нөлдік емес мәнді қайтарады, ал сәтсіз болса - false.

Келесі листингте С дискіде түпкі каталогта орналасқан demo_file.dat атты файлды жоятын программа көрсетілген:

Листинг 1 - Файлды жою

#include <windows.h> #include <iostream.h>

int main() {

// файлды жоямыз

if(!DeleteFile("C:\\demo_file.dat")) {

cerr « "Delete file failed." « endl

« "The last error code:  " « GetLastError() « endl; cout « "Press any key to finish."; cin.get(); return 0;

}

cout « "The file is deleted." « endl;

Мәліметтерді файлға жазу

Мәліметтерді файлға жазу үшін WriteFile функциясы қолданылады, бұл функция синхронды да, асинхронды да жазба үшін қолданылады. Мұнда тек мәліметтерді файлға жазудың синхронды түрі қолданылады. Бұл жағдайда мәліметтер файлға тізбектеліп жазылады – байттан соң байт және файл нұсқағышы жаңа позицияға ауысады. Енді WriteFile функциясын толығырақ қарастырайық. Бұл функция келесі прототиптерге ие:

BOOL   WriteFile(handle     hFile,   // файл дескрипторы

LPCVOID lpBuffer,                         // мәліметтер буферіне нұсқаушы

DWORD  nNumberOfBytesToWrite, // жазылатын байттар көлемі LPDWORD lpNumberOfBytesWritten, // жазылған байттар көлемі LPOVERLAPPED lpOverlapped  // асинхронды жазба кезінде қолданылады

) ;

Сәтті аяқталу кезінде функция нөлдік емес мәнді қайтарады, ал сәтсіз болса false.

hFile параметрінде файл дескрипторы болу керек және файл жазба кезінде ашық болу керек.

lpBuffer параметрі мәліметтер оқылатын жады аймағына нұсқау керек. nNumberOfBytesToWrite параметрі  WriteFile функциясы көмегімен жазу үшін шақырылатын байттар көлемін көрсету керек.

Төмендегі листингте жаңа файл ашып, оған бүтін сандар  тізбегін жазатын программа көрсетілген.

Листинг 2 - Файлдың жасалынуы және оған мәліметтердің жазылуы

#include <windows.h> #include <iostream.h>

int main() {HANDLE hFile;

// мәліметтерді жазу үшін файл ашамызhFile = CreateFiie(

"С:Wdemo_file.dat",                         //файл аты

GENERIC_WRITE,                          //файлға жазу

О,     // файлға монопольдік өту

NULL,        //қорғаныс жоқ

CREATE_NEW,                               //жаңа файл ашамыз

FILE_ATTRIBUTE_NORMAL,                 //қалыпты файл

NULL         // шаблон жоқ

);

// файл ашылуының сәттілігін тексереміз if (hFile == INVALID_HANDLE_VALUE) {

cerr « "Create file failed." « endl

« "The last error code:  " « GetLastError() « endl; cout « "Press any key to finish."; cin.getO ; return 0;

}

// файлға мәліметтерді жазамыз

for  (int i = 0;  i < 10; ++i)

{

DWORD dwBytesWrite;

if (!WriteFile(

hFile,          // файлдескрипторы

&i,    // жазба келіп жатқан буфер адресі

sizeof(i),      // жазылатын байттар көлемі

SdwBytesWrite,    // жазылған байттар көлемі

(LPOVERLAPPED)NULL     //синхронды жазба

))

{

cerr « "Write file failed.." « endl

« "The last error code: " « GetLastError() « endl; CloseHandie(hFile); cout « "Press any key to finish."; cin.get(); return 0;

}

}

// файлдескрипторын жабамызCloseHandie(hFile);

cout « "The file is created and written." <<endl; return 0;

}

 

Негізгі әдебиет: 3 [29-48], 4 [80-96].

Бақылау сұрақтары:

1) Файл түсінігі?

2) Файлмен жұмыс жасайтын негізгі командалар қандай?

3) Анықтама қалай ұйымдастырылады?

4) Файл атрибуттары?

5) chmod командасының синтаксисі?

 


4 Зертханалық жұмыс. Үрдістер мен ағындар

 

Жұмыс мақсаты: үрдісті басқару және ұйымдастыру. Үрдістің виртуальдық мекен-жайлық кеңістігін бөлшектеу. Үрдіс мәнінің құрылымы.

Тапсырмалар

Үрдістер мен ағындарды зерттеу. Үрдістер мен ағындарды құратын командаларды оқу. Үрдісті басқаратын командаларды оқып үйрену.

Тапсырмаларды орындау үшін әдістемелік нұсқаулар

Ағым деп операциялық жүйенің программаның орындалуына үрдіс уақыт бөлетін ядроның бір бөлігін атаймыз.  Әр ағымға келесі ресурстар тиесілі:

- Орындалып жатқан функцияның коды.

- Программаның жұмысына қажет стек.

- Операциялық жүйенің жұмысына қажетті стек.

- Үрдісордың регистрлар терімі.

- Қауіпсіздік жүйесіне арналған таңбалағыш.

Осы аталғандардың барлығы Windows-тағы ағымдар контексін құрайды. Дескриптордан басқа әр ағымда өзінің идентификаторы болады және ол жүйеде орындалып жатқан ағымдарға әмбебап болып келеді. Ағымдардың идентификаторлары қолданушыларға ағымдардың жұмысын бақылау үшін қызмет программалары көмегімен қолдануға болады.

Windows-та ағымдардың екі түрі ажыратылады:

- Жүйелік ағымдар.

- Қолданушы ағымдары.

Жүйелік ағымдар операциялық жүйенің әртүрлі сервистерін орындайды, және ол операциялық жүйенің ядросынан қосылады. Ал қолданушы ағымдары қолданушының тапсырмаларын ғана шешеді. Жұмыс істеп тұрған программада ағымның екі түрі болады:

- Жұмысшы ағымдар (working threads);

- Қолданушы интерфейсінің ағымдары (user interface threads).

Ағымдарды жасау

createThread функциясынан ағым туындайды. Сол функцияның прототипі:

HANDLE   CreateThread(LPSECURITY_ATTRIBUTES

lpThreadAttributes,                          // қорғаныс атрибуты

DWORD       dwStackSize,               //ағымдағы стектің байтпен көлемі

LPTHREAD_START_ROUTINE IpStartAddress, // функцияның адресі

LPVOID lpParameter,                    // параметрдің адресі 

DWORD  dwCreationFlags,            // ағымды жасау флагтары

LPDWORD lpThreadld                    //ағымның  идентификаторлары

) ;

Егер CreateThread функциясы сәтті аяқталса, туындаған ағымның идентификаторын және дескрипторын қайтарады. Ал басқа жағдайда бұл функцияның мәні null болады. CreateThread функциясының параметрлерін атап өтейік.

lpThreadAttributes параметрі туындаған ағымға  қауіпсіздік атрибутын орнатады.

Dwstacksize параметрі стектің өлшемін анықтайды.

lpstartAddress  параметрі ағымда орындалып жатқан функцияға сілтейді. Бұл функция келесі прототипке ие:

DWORD WINAPI ағымның_функциясының_ аты(LPVOID lpParameters);

Бос типке сілтеуіш lpParameter параметрі ағымдағы функцияға жалғыз берілуі мүмкін.

Бұл шектеу функцияның шақырылу аймағына байланысты, біздің жағдайда қосымша программадан емес операциялық жүйеден шақырылған, ал dwcreationFiags параметрі ағым қандай күйде туындайтынын анықтайды. Егер бұл функцияның мәні 0-ді қабылдаса, ағымның функциясы ағым туындағаннан кейін орындала бастайды.

ІpThreadid параметрінің мәнін Windows қондыратындықтан ол шығысты функция деп аталады. Бұл параметр айнымалығаWindows орнатқан ағым идентификаторына  сілтеу керек. Бұл идентификатор барлық жүйеге әмбебап. Ары қарай ағымдарға сілтеуіш ретінде қолдануға болады.

Төмендегі листингте  CreateThread функциясын қолдана отырып, ағым тудыратын және ағымдағы орындалып жатқан функцияның қандай параметрлерді беретінін көрсетеді.

 

Листинг 1 - CreateThread функциясы арқылы ағым жасау

#include <windows.h>

 #include <iostream.h>

volatile int n;

DWORD WINAPI Add(LPVOID iNum) {

cout « "Thread is started." « endl;

 n +=  (int)iNum;

cout « "Thread is finished." « endl;

return 0;

}

int main() {

int inc = 10; HANDLE hThread;

DWORD IDThread;

cout « "n = " « n « endl; // Add ағымын жібереміз

hThread = CreateThread (NULL, 0, Add, (void*) inc, 0, &IDThread) ;

if  (hThread == NULL) return GetLastError();

//Add жұмысын бітіргенше күтеміз WaitForSingleObject(hThread, INFINITE);

// Add ағымының дескрипторын жабамыз CloseHandie(hThread);

cout « "n = " « n « endl;

return 0;

 

Үрдіс деп орындалып жатқан программаға қажет жүйелік ресурстарды қолданатын Windows-тің ядросының бір объектісін айтамыз. Осыдан  Windows-та үрдіс деп орындалып жатқан программаны айта аламыз. Әр үрдістің орындалуы алғашқы ағымнан басталады. Үрдіс өзі де көптеген ағымдарды туғыза алады. Егер ағымдарының бәрі аяқталса, үрдіс те аяқталады. Windows-тағы әр үрдіске келесі ресурстар тиесілі:

- Виртуалдық адрестік кеңістік.

- Нақты уақыттағы беттермен жұмыс.

- Қауіпсіздік жүйесіне арналған таңбалағыш.

- Ядроның дескрипторларын сақтайтын кесте.

Windows-тағы әр үрдістерде дескриптордан басқа идентификаторлар болады және ол жүйеде орындалып жатқан үрдістер үшін әмбебап болып табылады.

Үрдістердің идентификаторлары қолданушыларға ағымдардың жұмысын бақылау үшін қызмет программаларға қолданылады.

Үрдістерді жасау

Windows-тағы әр жаңа Үрдіс жасау үшін createProcess функциясы қолданылады.

BOOL CreateProcess(

LPCTSTR lpApplicationName,                  //орындалушы модулінің аты

LPTSTR lpCoramandLine,              //командалық жол

LPSECURITY_ATTRIBUTES lpProcessAttributes,       //Үрдістіқорғау

LРSECURITY_ATTRIBUTES lpThreadAttributes,       //ағымды қорғау

BOOL blnheritHandles,                    //дескриптордың мұрагерлік белгісі

DWORD dwCreationFlags,             //Үрдіс тудыратын флагтар

LPVOID IpEnvironment,        // жаңа орта блогы

LPCTSTR lpCurrentDirectory,                  // ағымдағы каталог

LPSTARTUPINFO IpStartUpInfо, II бас терезе көрінісі

LPPROCESS_INFORMATION lpProcessInformation //Үрдіс туралы ақпарат

) ;

Егер createProcess функциясы үрдісті сәтті аяқтаса, бірді береді, ал басқа жағдайда нөлді қайтарады.

2-листингте өзінің аты мен үрдістерінің атын консольге шығаратын функция келтірілген:

Листинг 2

#include <conio.h>

int main(int argc, char *argv[])

{

int i;

_cputs("I am created.");

_cputs("\nMy name is: ");

_cputs(argv[0]);

for (i = 1; i < argc; ++i)

_cprintf ("\n My %d parameter =  %s", i, argv[i]);

 

_cputs("\nPress any key to finish.\n");

_getch();

return 0;

}

Программаны компиляциялаңыз. Алынған ехе файлды ConsoleProcess.exe атымен С дискісіне сақтаймыз. Мақсатымыз бұл файлды жаңа үрдіс ретінде жіберу. Осы айтылғандар 3-листингте келтірілген:

Листинг 3

#include <windows.h>

#include <conio.h>

int main()

{

char lpszAppName[] = "C:\\ConsoleProcess.exe";

STARTUPINFO si;

PROCESS_INFORMATION piApp;

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

// жаңа консольдік Үрдіс жасаймыз

if (!CreateProcess(lpszAppName, NULL, NULL, NULL, FALSE,

CREATE_NEW_CONSOLE, NULL, NULL, &si, &piApp))

{

_cputs("The new process is not created.\n");

_cputs("Check a name of the process.\n");

_cputs("Press any key to finish.\n");

_getch();

return 0;

}

_cputs("The new process is created.\n");

//жасалынған Үрдістің аяқталуын күтеміз

WaitForSingleObject(piApp.hProcess, INFINITE);

// осы Үрдістің дескрипторларын жабамыз

CloseHandle(piApp.hThread);

CloseHandle(piApp.hProcess);

return 0;

}

 

Негізгі әдебиет: 2 [64-77], 4 [221-242].

Бақылау сұрақтары:

1) Үрдіс түсінігі?

2) Үрдіс жоспарлаушының түсінігі?

3) Құрған үрдістен ағын қалай ажыратылады?

4) Үрдістермен, ағындармен жұмыс жасайтын командалар?

5) Үрдіс идентификаторы қалай беріледі (PID)?

 

5 Зертханалық жұмыс. Ядро жұмысы

 

Жұмыс мақсаты: жүйедегі сұраныстарды орындау үшін базалық функцияларды қарастыру.

Тапсырмалар

Unix операциялық жүйесі ядросының ішкі құрылымын зерттеу және жүйедегі сұраныстарға қызмет көрсететін базалық функцияларды оқу.

Тапсырмаларды орындау үшін әдістемелік нұсқаулар

DLL-ді динамикалық жүктеу және ажырату

DLL-ді үрдістiң виртуалды жадына динамикалық жүктеу үшiн LoadLibrary және LoadLibraryEx екi функция қолданылады. LoadLibraryEx функциясының LoadLibrary функциясынан кiтапхананың жүктеу тәртiбін басқаруға мүмкiндiк беретін айырмашылығы бар. Бұл функцияларды толығырақ қарастыралық.

Динамикалық қосылатын кiтапхананы жүктеу үшiн келесi түп тұлғасы бар LoadLibrary функциясы қолданылады:

hmodule   LoadLibrary (

lpctstr   lpFileName    //файлдың аты

) ;

Бұл функциялар табысты аяқталу жағдайында жүктелетін модульдің дескрипторын қайтарады, ал сәтсiздiк жағдайында NULL болады.

Бұл функцияның жүктелетiн файлдың аты болатын жалғыз параметрi жолға көрсетедi. Егер бұл файлдың толық жолы болса, онда дәл сол файл жүктеледi. Егер тек қана файлдың аты көрсетiлсе, онда бастапқыда жүйе бұл модул бұрын жүктелген болуы мүмкiндігін анықтайды. Егер мақұлданса, онда жүйе жүктелген модульдің дескрипторын қайтарады, қарсы жағдайда жүктеу үшiн келесi iздестiру алгоритмі қолданылады:

1) Іске қосылған қосымшадан каталог қаралады.

2) Үрдістiң ағымдағы каталогы қаралады.

3) Windows-тың жүйелiк каталогы қаралады.

4) Windows-тың каталогы қаралады.

5) PATH айнымалы ортада көрсетiлетiн каталогтар қаралады.

Сонымен бiрге егер файлдың түрi көрсетiлмесе, онда жүйе бұл файл үндемеу бойынша DLL кеңейтуiн алуын санайтынын есепке алу керек. Файлдың түрi болмайтынын атап өту үшiн файлдың атынан кейiн жай ғана нүктенi көрсетуi керек.

Егер DLL iздестiруi жетiстiкпен бiтсе, онда кiтапхана үрдістiң виртуалды жадына жүктеледi, содан соң оның DiiMain функциясы  DLL_PROCESS_ATTACH мәнiне тең  fdwReason параметрiмен шақырылады. Егер бұл функция FALSE мәнiн қайтарса, онда ол жүйемен тағы да шақырылады, бiрақ DLL_PROCESS_DETACH fdwReason параметрiнiң мәнiмен тең, DLL осыдан кейiн жүк түсiредi.

Жүктеулер үшiн динамикалық қосылатын кiтапханалар сонымен бiрге атқарылатын модульдер келесi түп тұлғасы болатын LoadLibraryEx функциясы қолданылады:

hmodule LoadLibraryEx(lpctstr lpFileName,       // файлдың аты

HANDLE hFile,                                                  // кейiнге сақтаған

DWORD dwFlags                                     // жүктеуді басқарудың жалаулары

) ;

Табысты аяқталу жағдайында жүктелетін модульдің дескрипторын қайтарады, ал сәтсiздiк жағдайында NULL болады.

LoadLibrary функциясы сияқты lpFileName параметрі файл атына нұсқағыш болып келеді. Жүктелетiн модульдің iздестірілуі dwFlags параметрiнде жүктелетiн модульдің талғаулы алгоритмін көрсететін шарт орындалса, сол алгоритм бойынша LoadLibrary функциясы орындалады.

HFile параметрі жүйемен ары қарай қолдану үшiн кейiнге сақтаған және NULL-ге әрдайым орнатылуы керек. DwFlags параметріне модульдің жүктеуiн басқару байрақтармен беріледi және келесi мәндердің бiреуін қабылдай алады:

- dont_resolve_dll_references—Windows басқару жүйелерiнде DLLMain функциясын DLL жүктеуiнен кейiн шақырылмайды, сонымен бiрге бұл DLL орындауы үшiн керек болатын қосымша модулдар жүктелмейдi;

- load_library_as_datafile—модул осы жағдайда мәлiмет файлы сияқты жүктеледi, сонымен бiрге бағдарламалардың күйге келтiруге және шақыруы бойынша ешқандай да әсерлер орындалмайды. Атап өтемiз, Windows 98-шi басқару жүйесi осы жағдайда қорлармен тек қана басқару функцияларындағы модулдың қайтарылатын дескрипторын қолдануға рұқсат бередi;

- load_with_altered_search_path— қосымша iске қосылған каталог осы жағдайда iздестiру алгоритміне жүктелетiн модулдың iздестiруiнде қаралмайды.

Үрдістен DLL-ды ажырату үшiн FreeLibrary функциясын қолданады және оның келесi прототипі болады:

BOOL FreeLibrary(HMODULE hModule // дескриптор DLL

) ;

Бұл функцияның hModule жалғыз параметрiнде LoadLibrary немесе LoadLibraryEx функцияларымен алдын-ала алынатын жүктi түсiретiн модульдің дескрипторы орнатылуы керек.

Басқару жүйесi үрдістің адрестi кеңiстiктен DLL жүкті түсiру алдында DLL_PROCESS_ATTACH тең мәнiне fdwReason параметрiмен DiiMain функциясын шақырады.

Бiр уақытта ағынды аяқтау және DLL ажырату үшiн FreeLibraryAndExitThread функциясы қолданылады және оның келесi прототипі болады:

VOID FreeLibraryAndExitThread (HMODULE hModule,

// DLLдескрипторы

DWORD dwExitCode                                // ағынды қайтару коды

Бұл функция келесi екi функцияларды бiртiндеп шақыруына баламалы:

FreeLibrary (hModule) ; Exi tThread(dwExi tCode);

Бұл функцияның шақыруы тек қана динамикалық кiтапхананың бiр уақытта өз жұмысын бiтiретiн және өзінiң бұл кiтапханасын жүктi түсiретiн ағынында мағынасы болады.

Жүктеу және ажыратуы DLL функциялары туралы келесi ескертудi жасаймыз. Негiзiнен, ылғи да бiр DLL-дың функция жүктеуi  қосымшада бірнеше  рет шақырыла алады, оның көп тасқынды қосымшада мағынасы болады. Бұл жағдайда әрбiр жаңа ылғи да бiр DLL-дың жүктеу функциясы шақыруында  осы кiтапхана қайта жүктелмейді, әрбiр функцияны шақыруда бiрлiкке үлкейетiн кiтапханаға есептеуiшi сiлтемелер қолданылады. Сәйкесiнше сiлтемелердiң есептеуiшi бұл DLL-лар әрбiр ажыратуда бiрлiкке азаяды. Егер бұл кiтапханаға сiлтемелердiң есептеуiшi нөлге тең  болып қалыптасса, онда динамикалық қосылатын кiтапхана тек қана сол жағдайда жүк түсiредi.

DLL-дың қолдануы

Егер программа DLL-дың кейбiр функциялары және айнымалыларын қолданса, онда бұл олардың DLL-дан импорттайтынын айтады. Импортталатын функцияларға және айнымалыларға DLL-дың рұқсатын қамтамасыз ету үшiн келесi түп тұлғасы болатын GetProcAddress функциясы қолданылады:

farproc GetProcAddress(hmodule hModule,      // DLLдескрипторы

lpcstr lpProcName                                         // функцияның аты

) ;

Табысты аяқтау жағдайында функцияның кiтапханасынан экспортталатын мекен жайын қайтарады, ал сәтсiздiк жағдайында NULL. Бұл функцияның параметрлерiн ендi сипаттаймыз.

HModule параметр LoadLibrary немесе LoadLibraryEx функциясымен алдын ала алынған DLL-дың дескрипторы болуы керек.

LpProcName параметр импортталатын функцияның атын немесе оның реттiк нөмiрiн көрсетуi керек. Соңғы жағдайда функцияның реттiк нөмiрiне тапсырыс беру үшiн ең жақсысы n функцияның реттiк нөмiрiн тапсырма беретiн  MAKEINTRESOURCE(n) макросты пайдалану. Сонымен бiрге GetProcAddress функциясы DLL-дан экспортты айнымалысына рұқсаты үшiн қолданыла алатынын атап өтемiз. DLL-дан функцияны импорттайтын бағдарлама 1-листингте келтiрiлген.

Листинг 1 – Қолданыста аты бар функциялардың және айнымалылардың DLL-дан импорты

# include <windows. h> #include <iostream.h>

int main()

{

HMODULE                  //       DLL дескрипторы

hDll; int               //       функцияға көрсеткіші

(*Add)(int) DLL-дан Add

; int                      // функцияға көрсеткіші

(*Sub)(int) DLL-дан Sub

; int                      //айнымалыға көрсеткіші

*pCount;             DLL-дан count

// динамикалық қосылатын кiтапхананы жүктеймiз

hDll = LoadLibrary("Count.dll"); if  (IhDll) {

cerr « "Load library failed." « endl; return GetLastError();

}

// DLL-дан count айнымалының мекен-жайын күйiне келтiремiз

pCount =  (int *)GetProcAddress(hDll,   "count"); if (IpCount) {

cerr « "Get variable address failed." « endl; return GetLastError();

}

// бастапқы айнымалының мәнін шығарамыз

count cout « "Initial count = " <<  (*pCount) « endl;

cerr « "Get procedure address failed." « endl; return GetLastError();

// функцияның мекен-жайларын күйiне келтiремiз

Add =  (int (*)(int))GetProcAddress(hDll, "Add"); Sub = (int (*)(int))GetProcAddress(hDll,   "Sub"); if  (!Add ||   !Sub) }

// есептеуiштiң мәнiн өзгертемiз

cout « "count = " « Add(20) « endl;

cout « "count = " « Sub(15) « endl;

// кiтапхананы өшіреміз

if  (!FreeLibrary(hDll))

{

cerr « "Free library failed." « endl; return GetLastError();

}

// программадан шығамыз

cout « "Press any key to exit ";

cin.getO;

return 0;

}

Ендi бұл бағдарламаны 2 - листингте келтiремiз, бiрақ функциялар және айнымалыларды DLL-дан олардың реттiк нөмiрiн қолдана отырып импорттайды.

Листинг 2 - DLL-дан функциялардың және айнымалылардың импорты

# include <windows.h>

#include <iostream.h>

int main() {

HMODULE                            //       DLL дескрипторы

hDll; int                        //       функцияға көрсеткіші

(*Add)(int)           DLL-дан Add

; int                               //       функцияға көрсеткіші

(*Sub)(int)           DLL-дан Sub

; int                               //айнымалыға көрсеткіші

*pCount;             DLL-дан count

// динамикалық қосылатын кiтапхананы жүктеймiз

hDll = LoadLibrary("Count.dll"); if  (IhDll) {

cerr « "Load library failed." « endl; return GetLastError();

}

// DLL-дан count айнымалының мекен-жайын күйiне келтiремiз

pCount =  (int *)GetProcAddress(hDll, MAKEINTRESOURCE(3));

if (IpCount)

{

cerr « "Get variable address failed." « endl; return GetLastError();

}

// бастапқы count айнымалының мәнін шығарамыз

cout « "Initial count = " <<  (*pCount) « endl;

// функцияның мекен-жайларын күйiне келтiремiз

Add =  (int (*)(int))GetProcAddress(hDll,   "Add"); Sub =  (int (*)(int))GetProcAddress(hDll,   "Sub"); if  (!Add ||   !Sub) }

cerr « "Get procedure address failed." « endl; return GetLastError();

// есептеуiштiң мәнiн өзгертемiз

cout « "count = " « Add(20) « endl;

cout « "count = " « Sub(15) « endl;

// кiтапхананы өшіреміз

if  (!FreeLibrary(hDll))

{

cerr « "Free library failed." « endl; return GetLastError();

}

// программадан шығамыз

cout « "Press any key to exit ";

cin.getO;

return 0;

}

Функциялардың реттiк нөмiрi осы жағдайда бiрлiктен бастайтынын атап өтейік, тек қана содан соң айнымалы беріледi. Осыған байланысты келесi ескертудi жасаймыз. Функциялар және айнымалылардың реттiк нөмiрлерiн қолдану GetProcAddress функциясында бұл функцияны тез орындауға мүмкiндiк бергенмен, бiрақ бейнелi түрде аттарды қолдану берiгiрек және сәйкесінше артықшылығы көбірек болады.

 

Негізгі әдебиет: 2 [205-237], 4 [248-261],5 [191-201].

Бақылау сұрақтары:

1) Unix жүйесінің ішкі құрылымы қандай бағыныңқы жүйелерден тұрады?

2) Ядроның негізгі тапсырмалары?

3) Ядроны конфигурациялау.

4) Ядроның жүктелетін модульдері.

Әдебиеттер тізімі 

1.     Джеффри Рихтер. Windows. Создание эффективных Win32- приложений с учетом специфики 64-разрядной версии Windows.-СПб., М., Харьков, Минск: “Русская редакция”, “Питер”, 2008 (Серия: для профессионалов).

2.     Ал Вильямс. Системное программирование в Windows. – СПб.: Питер, 2007.

3.     Джонсон М. Харт. Системное программирование в среде Win32. – М.: Издательский дом “Вильямс”, 2007.

4.     Румянцев П.В. Азбука программирования в Win32 API. – М.: Горячая линия – Телеком, 2006.

5.     Румянцев П.В. Работа с файлами в Win32. – М.: Горячая линия – Телеком, 2005.

6.     Ганеев Р.М. Проектирование интерфейса пользователя средствами Win32 API. – М.: Горячая линия – Телеком, 2004.

 

Мазмұны

 

1 Зертханалық жұмыс. Жүйелік бағдарламалауды іске қосу және инициализациялау

3

2 Зертханалық жұмыс. Енгізу-шығаруды ұйымдастыру тәсілдері

6

3 Зертханалық жұмыс. Файлдық жүйенің базалық функциялары

11

4 Зертханалық жұмыс. Үрдістер мен ағындар

16

5 Зертханалық жұмыс. Ядро жұмысы

20

Әдебиеттер тізімі

25

  

2011 ж. баспа жоспары, реті 249