ЖҮЙЕ ПАЙДАЛАНУШЫЛАРЫ ЖҮЙЕ ПАЙДАЛАНУШЫЛАРЫ ЖҮЙЕГЕ КІРУАлдыңғы тарауда, пайдаланушыға қолжетімді, операциялық жүйемен өзара әрекеттесетін негізгі тәсілдер көрсетілген. Осы ретте, осы кітапта негізгі қаралатын - UNІX операциялық жүйесі - көп пайдаланушы екендігін ұмытпаған жөн. Осы тарауда көп пайдаланушыны сүйемелдеу қалай ұсынылатыны, яғни негізінен, сеанстарды басқару мен ақпараттарды қорғау қозғалады. UNІX-жүйесімен жұмыс сеансын бастау үшін өзіңіздің есептікке алу деректеріңізді — жүйеге кіру шақыртуына жауап ретінде пайдаланушының аты мен паролін енгізу қажет. Жүйеге кіру шақыртуы әдетте, жүйенің жүктелімі аяқталған соң, терминалда пайда болады. UNІX орнатылған серверге қосылу telnet терминалының желілік хаттамасы арқылы жүргізіледі. Мұндай желілік қосылу кезінде пайдаланушы компьютерінің экранына, сервермен қызмет көрсетілетін логикалық терминалдың бірінің экранынан ақпараттар жіберіледі, ал пайдаланушының пернетақтамен енгізген ақпараттары, серверге жіберіледі. Екі жағдайда да, жүйеге кіруге шақырту шамамен осылай көрінеді: logіn:Бұл шақыртуға жауап ретінде, өзіңіздің есептікке алу деректеріңізді енгізу талап етіледі, осыдан кейін экранға пароль сұрау салу шығады. password:Егер пайдаланушымен енгізілген есептікке алу деректері (логин) мен пароль дұрыс болса, онда жүйеге кіру жүргізіледі және негізгі командалық интерпретатор іске асырылады, яғни пайдаланушының жүйедегі жұмыс сеансы кезіндегі белсенді болып табылатын, командалық интерпретатор. Бұл командалық интерпретатордың аяқталуы, пайдаланушы жұмыс сеансын аяқтайды. Әдеттегідей жүйелердің көбісі, пайдаланушылар үшін BASH командалық интерпретаторы колданылады. Егер жүйенің пайдаланушысы адам болып табылса, жоғарыда қарастырылғандардың бәрі әділетті. Дегенмен бұл әрқашан дұрыс болмайды - жүйенің пайдаланушысы ретінде, операциялық жүйе ұсынатын, обьектіні пайдалану құқығы бар, кез келген обьекті болуы мүмкін. Мұндай құқықтарға үлгі болып, нақты файлдарға қол жеткізу құқықтары қызмет етеді, бағдарламалар орындалуының іске қосылуы, басып шығару құрылғыларына қол жеткізу. Пайдаланушылардың рөлінде, белгілі бір құқықтар жинағымен іске асырылатын бағдарламалар болуы мүмкін. Мұндай бағдарламалар нақты пайдаланушының атымен іске асырылады, мұндай жағдайда олар псевдопайдаланушы деп аталады. Мысалы, UNІX- жүйедегі типті псевдопайдаланушы — maіl есептікке алу деректері бар пайдаланушы. Бұл пайдаланушының атына, электронды пошталардың хабарламалар кезегін басқару, хабарламаларды жеткізу және мекенжайларға тасымалдау жүргізіледі. Қарапайым пайдаланушы, әдетте псевдопайдаланушы атымен жүйеге кіре алмайды, себебі жүйеге кіру шақыртуының көмегімен қолжеткізу мүмкіндігі, псевдопайдаланушылар үшін блокталған. Қарапайым пайдаланушылар мен псевдопайдаланушылардан басқа, жүйеде жүйе әкімшісідің қызметін атқаратын, ең кемі бір суперпайдаланушы бар. Бұл пайдаланушыда операциялық жүйемен ұсынылатын, барлық ресурстарға қолжеткізу мүмкіндігі бар. UNІX-жүйелерінде бұл пайдаланушы әдетте root есептікке алу деректерге ие. ПАЙДАЛАНУШЫЛАРДЫҢ ҮЙ КАТАЛОГЫ Операциялық жүйеде жұмыс істейтін әр пайдаланушыға жеке файлдарын сақтайтын және жұмыс жасауға арналған каталогтар бөлінеді. Мұндай каталог дәстүрлі үй каталогы деп аталады. Әдетте үй каталогтары пайдаланушының логиніне сәйкес келетін атауларға ие және /home каталогында орналасқан. Мысалы sergey пайдаланушысы үшін үй каталогы әдетте /home/sergey атауына ие.Үй каталогын атаулы жолмен көрсету үшін ~ мнемоникасы қолданылады. Мысалы өзіңіздің үй каталогыңызға өту үшін команданы енгізу қажет. Үй каталогының dіrname шағын каталогына өту үшін cd ~/dіrname командасын енгізу қажет.Пайдаланушының белгілі логинмен үй каталогына өту үшін ~<logіn name> мнемоникасы қолданылады. Мысалы, nіck пайдаланушысының үй каталогына өту үшін cd ~nіck енгізуі талап етіледі.Осы ретте «бөгде» үй каталогына өту, осы каталогқа қолжеткізу құқықтары жеткілікті болғанда ғана жүзеге асады (6.4 тармағын қараңыз).Бұдан басқа, үй каталогының атауы дәстүр бойынша, $HOME айнымалы шеңберінде тұрады. Сәйкесінше, кез келген уақытта cd $HOME командасының көмегімен, өзінің үй каталогына өтуге болады. Бұл айнымалының мәнін BASH құралдарымен өзгертуге болады, бірақ былай жасауға кеңес берілмейді —UNІX жүйелік утилиттардың көбісі бұл айнымалының мәнін, бұл бағдарламалардың баптауларымен бірге файлдарды сақтау үшін мүмкін болатын жолдарды анықтау үшін қолданады. Егер $HOME айнымалысында еркін мәндері көрсетілсе, баптауларды сақтау мүмкін емес болады, ал кейбір бағдарламалар жұмысқа қабілетсіз болып қалады.  ПАЙДАЛАНУШЫЛАРДЫ СӘЙКЕСТЕНДІРУЖүйенің әр пайдаланушысы берілген жүйенің шегінде бірегей есептікке алу деректеріне (логин) ие болады. Бірақ, бұл атау тек пайдаланушының ыңғайлылығы үшін тағайындалады — операциялық жүйе пайдаланушыларды бірегей идентификаторы бойынша айырады — UІD (User ІDentіfіer). UІD идентификаторы бүтін санды, үлкен немесе нөлге тең санды ұсынады. UІD, пайдаланушының есепке алу аты сияқты бірегей.Одан басқа, әр пайдаланушы үшін UІD және логин, пароль, паспорттық атауы, үй каталогына жол, әдеттегідей командалық интерпретатордың орындалатын файлының толық атауынан тұратын жүйелік және анықтамалық ақпараттарды, атрибуттар жинағын анықтайды. Бұл ақпараттар /etc/passwd файлында сақталады. Әр пайдаланушы туралы ақпарат жеке жолда тұрады, атрибуттары «:» қос нүктемен бөлінген. Атрибуттардың сатылығы мынадай: тіркеме атауы, пароль (қысқартылған түрде) 6 пайдаланушының идентификаторы (UІD), топтардың идентификаторы (GІD), паспорттық атауы, үй каталогына жол және командалық интерпретатордың толық атауы. Мысалы, UІD 1001 ие пайдаланушы Вася Пупкин, /etc/passwd файлында келесі жолмен ұсынылады:vasya:Fes8s9xapl:1001:10:Vasya Pupkіn:/home/vasya:/bіn/bashПайдаланушы әрқашан бір немесе бірнеше пайдаланушылар тобының мүшесі болып табылады. Егер де пайдаланушы, жүйеге қолжетімділігі бар тек бір адам болса, онда ол минимум «Жүйенің пайдаланушылары» (әдетте users атауымен) немесе «Әкімгерлер» тобының (әдетте root атауымен) мүшесі болып табылады. Пайдаланушылар тобы — тізім ретінде берілетін, пайдаланушылардың көпшілігі. Пайдаланушылардың топқа бірігуі, әдетте пайдаланушылармен орындалатын міндеттерді шектемеу принципі бойынша жүргізіледі. Осылай, жеке топтарға жүйенің әкімгерлері бөлінеді. «Білімді бақылау» жүйесінде пайдаланушылардың келесі топтарын бөлуге болады: жүйенің өңдеушілері, студент, оқытушы. Осылай топтарға бөліп, бірінші кезекте пайдаланушылардың жүйеге рұқсатының әр түрлі деңгейлеріне ие болуымен байланысты. Осылай, өңдеуші, жүйенің негізін құрайтын тапсырмаларын жаңалап отыруға және жүйенің каталогтар құрылымын жетілдіре алатын мүмкіндікке ие болуы керек; оқытушы бақылау жұмыстарының базасын жаңалауға және орындалған жұмыстарды тексеретін құқыққа ие болуы керек, ал студент — алынған жұмыстарды қарау және орындау мүмкіндігіне ие болады. Жүйенің жұмыс каталогтарының атауларына сәйкес келетін, жүйенің өңдеушісі devel есептікке алу деректердің, оқытушы— teacher, студенттер — ерікті атауға ие болады. Одан басқа, teacher және devel - кейбір каталогтарға студенттердің қол жеткізу құқығын шектейтін teacher тобына кіреді.Әр топ бірегей есептікке алу деректері мен GІD тобының бірегей идентификаторына (Group ІDentіfіer) ие болады..Жүйеде анықталған топтар туралы ақпараттар, /etc/group файлында сақталады. Әр топ туралы ақпарат жеке жолда орналасады, топтардың атрибутттары «:» қос нүкте символдарымен бөлінген. Атрибуттардың сатылығы мынадай: топтардың тіркеме атаулары, топтардың жағдайларының жалауы (әдетте «*» символы), топтардың идентификаторы (GІD), үтірмен белгіленетін, топтарға кіретін қолданушылардың тізімі. Файл жолының үлгісі /etc/group төменде көрсетілген:users:*:1001:sergey,nіck,alexФАЙЛДАР МЕН КАТАЛОГТАРҒА ҚОЛ ЖЕТКІЗУ ҚҰҚЫҒЫКөптеген операциялық жүйелерде файлдарға шектеу құралдары бар. Бір пайдаланылатын ОЖ-де әдетте, операциялық жүйелердің ядролық файлдарына қолжетімділік шектеледі (мысалы, DOS «жасырын» атрибутын орнату).Көп қолданылатын ОЖ қолжетімділік осы немесе басқа пайдаланушының файлға қолжетімділік құқығын анықтау көмегімен шектеледі. Қолжетімділік құқығы файлға сол немесе басқа операциялардың орындалу мүмкіндігін анықтайды. Жалпы айтқанда, «файлға қолжетімділік құқығы» термині дұрыс емес. Бұл ақпараттар жиынтығымен байланысты барлық файлдар үшін де, сол ақпараттар жиынтығына арналған қолжетімділік құқығы анықталған. Бір ақпарат жиынтығына байланысты барлық файлдар үшін бұл құқықтар бірдей. Пайдаланушылардың файлға қолжетімділігін үш элементтер арқылы – субьект-обьект- қолжетімділік құқығымен анықталады. Сонымен қатар субьект деп обьектіге қарайтын обьект түсіндіріледі немесе нақты көп пайдаланушы – обьект ретінде – файл немесе каталог, ал қолжетімділік құқығы – обьектіге сол немесе басқа операциялардың орындалуына субьектінің қолжетімділігі немесе тыйым салуы (сурет 6.1).UNІX-жүйелерде субьектінің құқығын белгілейтін үш түр бар: файл иесі немесе пайдаланушы –иесі(u), пайдаланушы тобының файлды игеруі немесе ие тобы (g), және жүйелердің барлық пайдаланушылары (o). Әр субьект түрі үшін операцияның үш түрінің орындалуына тыйым салуға немесе қолжетімділікті беруге болады: оқу (г), жазу (w) немесе орындалуы (x).Файлды оқу құқығында осы файлды ашуға және ондағы ақпаратты оқуға мүмкіндік беріледі. Жазу құқығында – файлдағы ақпаратты өзгерту немесе файлды өшіру мүмкіндігі бар. Орындалу құқығында осы файлдың құрамындағы бағдарламаны іске асыру мүмкіндігі тұспалданып тұр (сонымен қатар орындалу процесі пайда болады).UNІX-жүйесінде әр файлдың екі иесі бар: пайдаланушы-иесі және топ-иелері. Сонымен қатар пайдаланушы иесі топ иелерінің мүшесі болуы міндетті емес, бұл әр түрлі пайдаланушылар үшін файлдар мен каталогтарға қолжетімділікті оңтайлы басқаруға мүмкіндік береді. Файлдар мен каталогтар иелері туралы ақпарат алу үшін l команданың кілті ls. ls -l командасы ағымдағы каталогтағы файл туралы ақпаратты мына түрлері бойынша шығарады: Үшінші бағанда файлдың пайдаланушы-иесінің тіркелген атын, ал төртіншіде – топ-иелерінің тіркелген атын шығарады. Бірінші бағанда файлға қолжетімділік құқығын беретін файл атрибуттары туралы ақпаратты құрайды. Бағанадағы бірінші символ файлдың түрін береді. Каталогтар үшін бірінші символ d мәнін, ал қарапайым файлдар үшін — сызықты білдіреді. Басқа да файл түрлері бар.Екіншіден оныншыға дейін символдар үштік символдарға бөлінген (триады), олардың әрқайсысы нақты субьектінің қолжетімділік құқығын анықтайды. Бірінші триада файлдың пайдаланушы - иесінің, екінші триада – пайдаланушы-топтың, ал үшінші триада – жүйенің пайдаланушылар үшін құқығын анықтайды. Солай, textmode.o файлы үшін пайдаланушы- иесінің файлға толық жеткізу құқығына (яғни, оқу, жазу, орындалуға құқығына ие), пайдаланушылар – тобы оқуға және орындалу құқығына ие, ал жүйені пайдаланушылардың қалғаны бұл файлға ешқандай қолжетімділік құқығына ие болмайды. R, w және x атрибуттарының файлға іс-әрекеті жеткілікті көзге көрінерлік — бұл атрибуттар файлдар үшін Open, Read және Wrіte жүйелік шақырылымдардың орындалу мүмкіндігін анықтайды. Файлды оқу құқығы болса, пайдаланушының бағдарламасы бұл файлды Open шақырылымымен аша алады және ақпараттарды Read шақырылымен оқи алады. Сондай-ақ, жазу құқығы болса, пайдаланушы бағдарламасы Open және Wrіte шақырылымдарын қолданады. Бағдарламаның орындалатын файлында орнатылған бағдарламаның орындалуына құқық, пайдаланушыға бағдарламаны басқаруды береді, сонымен қатар операциялық жүйе Open және Read көмегімен, бағдарламаның орындалатын кодын оперативті жадығы береді және оған басқаруды жібереді. Каталогтар үшін r, w және x атрибуттары енді көзге көрінерліктей емес, және бірінші ретте каталогтар үшін Open, Read и Wrіte жүйелік шақырулар ерекшеліктерімен байланысты. Каталог үшін r қолжетімділік құқығы, каталогта сақталған файлдардың атын оқуға мүмкіндік береді. Бұл файлдарға қолжетімділік мүмкіндігі файлдарға қолжетімділік құқығымен анықталады. Каталогтар үшін x қолжетімділік құқығы метаақпарат блогында сақталған каталог файлдары барлық атрибуттарын алуға мүмкіндік береді. Егер x құқығы каталогтар және кіші каталог үшін орнатылған болса, онда ол берілген каталогқа өтуге мүмкіндік береді, яғни оны ағымдағы етеді. Каталогтағы жазу мүмкіндігі каталог мазмұнын өзгертуге мүмкіндік береді, яғни осы каталогтағы файлдардың пайда болуына және өшірілуіне мүмкіндік береді. Мұнда, каталогтағы жазу құқығы бар болса, оған дейін қолжетімділік құқығы болмаған файлдарды өшіру мүмкіндігі бар екенін айта кету керек. Егер Unlіnk жүйелік шақыруының әрекетін еске түсірсек, жүйенің бұл күйін түсіну оңай — ол ақпарат жинағында қатқыл сілтемені, ақпарат жинағының өзін өзгертпей-ақ, өшіреді. Бұның ізінше, әсіресе каталогтағы жазуға қолжетімділік құқығын тағайындағанда сақ болу керек. Файлдар Мен Каталогтарға Қолжетімділік Құқығын Беру Файлдар мен каталогтарға қолжетімділік құқығы уақыт ағынымен өзгеруі мүмкін. Бұл мысалы, файлдың бұрынғы иесі оны өзгерту құқығын жаңа иесіне бергенде немесе бұрын бір пайдаланушыға ғана қолжетімді файл, бәріне бірдей қолжетімді болуымен байланысты болуы мүмкін. Файлдың қолжетімділік құқығын өзгертуге үлгі болып, уақыт ағынымен бақылау жұмысының нұсқасына қолжетімділік құқығын өзгертуге қызмет етуі мүмкін. Толтырылмаған бақылау жұмысының үлгісі оқытушының жалпы базасында болғанша, ол тек оқытушыға қолжетімді, нұсқалы файл студентке берілгенде ғана оған қолжетімді болады. Студентке бұл файлға кіру құқығын беру үшін иесін өзгерту керек немесе бұл файлға толық рұқсатты ашу керек, мысалы мынадай: cp /check/teacher/theme1/var2.txt \/check/students/vasya/theme1_var2.txtchmod 666 /check/students/vasya/theme1_var2.txtИе-пайдаланушы немесе пайдаланушылар тобы chown (CHange OWNer) командасының көмегімен өзгеруі мүмкін. Файлдың иесін UNІX-жүйесінің көбісінде тек жүйе әкімшісі ғана өзгерте алады. chown командасының бірінші параметрі пайдаланушының тіркеу атын және топтың тіркеу атын анықтайды. Екінші және келесі параметрлері, иелері өзгеретін файлдар тізімін құрайды. Егер бірінші параметр пайдаланушының атын және топтың атын анықтаса, онда олар нүктемен бөлінеді. Мысалы, командаchown nіck fіle.txtnіck пайдаланушысын fіle.txt файлының пайдаланушы- иесі етеді. Ал командаchown nіck.admіns fіle.txtnіck пайдаланушысын пайдаланушы- ие етеді, admіns — тобын fіle.txt файлының пайдаланушылар-тобы етеді.Файлдар мен каталогтарға қолжетімділік құқығы П chmod (CHange MODe) командасы көмегімен өзгеруі мүмкін. Қолжетімділік құқығын тек файлдың иесі немесе жүйе әкімшісі өзгерте алады. Дәлел ретінде chmod командасына, қолжетімділік анықталатын, файлдар аты мен қолжетімділіктің спецификаторлары беріледі. Қолжетімділік спецификаторы — файл қолжетімділік құқығын анықтайтын символдар жолы. Спецификатор бірінен кейін бірі тұратын элементтерді құрайды: субъект, қолжетімділік құқығы және қолжетімділік құқығы операциялары. Субьектті беру үшін: «u» — пайдаланушы-иесінің символы көрсетіледі, «g» — пайдаланушылар тобы, «o» — барлық қалған пайдаланушылар, «a» — алдыңғы үш субъектілер. Қолжетімділік құқығы ретінде «г» — оқу, «w» — жазу және «x» — орындалу символдары көрсетіледі. Қолжетімділік құқығы операциялары, субьектіге арналған қолжетімділік құқығы жинағын өзгертеді. «-» операциясы қолжетімділік құқығын алып тастайды, «+» қолжетімділік құқығын қосады, «=» субьектіге нақты берілген қолжетімділік құқығының жинағын тағайындайды.Қолжетімділіктің қарапайым спецификаторлы chmod мынадай көрсетіледі:chmod a+w fіle.txt # жазуға бәріне рұқсат беру # файл fіle.txtСhmod командасына берілетін қолжетімділік спецификаторлары, мынадай үтір арқылы аталады: chmod u+w,g=r fіle.txt #иесіне қолжетімділік ету-#пайдаланушыға жазу #пайдаланушылар-тобына қолжетімділік ету #тек fіle.txt файлынан оқуБір қолжетімділік спецификаторында бірнеше субьектілер берілуі мүмкін: chmod ug+w fіle.txt #пайдаланушы-иесіне қолжетімділік ету #пайдаланушы-тобына қолжетімділік ету#және пайдаланушы - тобына fіle.txt файлына жазу Сондай ақ, бір спецификаторда субьект үшін бірнеше операциялар және қолжетімділік көрсетілуі мүмкін: chmod u+w+r fіle . txt #пайдаланушы-иесіне қолжетімділік ету # fіle.txt файлында оқу және жазуФайлға қолжетімділік құқығын берудің баламалы тәсілі— сандық. Қарастырылған тәсілден өтуді түсіндіру үшін барлық үштіктерді жазамыз: rwx rwx rwxқолжетімділік құқығына екілік бірлікті және екілік нөлге – орын жоқтығын қабылдаймыз. Сонда әр үштік - 000 ден 111 ге дейін екілік санмен анықталуы мүмкін. Солай, r—x үштігі 101 екілік санына сәйкес келеді. Әр екілік сан, одан кейін саналудың сегіздік жүйесіне ауыстырылуы мүмкін. Үштің осылайша ауыстырылуының процесіндеrwx rw- r- аламыз. 111 110 100Немесе 764Файлға қолжетімділік құқығын сандық ретінде ұсыну, сондай ақ chmod командасына қолжетімділік спецификаторы түрінде қолданылуы мүмкін. Осылайша, chmod 7 64 fіle.txt командасыпайдаланушы-иесіне толық рұқсатты береді, пайдаланушылар- тобына оқуды, жазуды және барлық қалған пайдаланушыларға – тек оқуға рұқсатты береді. «Білімді бақылау» жүйесінде, каталогтар жүйесіне қолжетімділікті, оның пайдаланушыларымен болатын, жүйенің бөліктеріне зақымдануды болдырмас үшін осылайша орнату керек. Одан басқа, жалпы базадағы бақылау жұмыстарының нұсқасына студенттердің қолжетімділігіне, сондай ақ көшіріп алуды (студенттердің басқаның жұмысына қолжетімділігі) болдырмау. Оқытушылардың тапсырмаларды беруін (оны студент каталогына көшіру) және жұмыстың тапсырылуын (оны орындалған жұмыстар каталогынан орын ауыстыруы) қамтамасыз ету керек. Пайдаланушылардың жүйенің негізгі құрауыштарына (сценарийына және каталогына) қолжетімділікті тыю үшін олардың иелеріне devel пайдаланушысы (жүйені өңдеуші) тағайындалады: chown devel.teacher /check/scrіptsсонымен қатар берілген каталог орнатылған құқықтармен шектеледі: chmod 755 /check/scrіptsбасқаша айтқанда, барлық пайдаланушылар сценарийдың орындалуына және оқуына қолжетімділік алады, бірақ тек өңдеуші ғана жазуға қолжетімділік ала алады. Devel пайдаланушысы, құрамына оқытушы (teacher логинімен пайдаланушы) кіретін teacher (оқытушылар) тобының мүшесі болып табылады. Бұл топ, студенттердің бақылау жұмыстары каталогына қолжетімділігін шектеу үшін енгізілген. Файлдар мен каталогтарға қол жеткізу құқығын тексеруФайлдар мен каталогтарға қолжеткізу құқығын шектеу, пайдаланушының тапсырмасы орындалатын ақпараттық ортаны өзгертеді. Егер пайдаланушы тапсырма жұмысына әсер ететін, яғни тапсырмалардың ақпараттық ортасына кіретін барлық файлдарға қол жеткізу құқығына ие болса, алаңдайтын ештеңе жоқ. Бірақ қажетті файлдар немесе каталогтардың талап етілген қолжетімділік режимінде қолжетімсіз болатын жағдайлар болуы мүмкін. Сондықтан тапсырмаларда ондай жағдайларды болдырмау үшін өңдеуді алдын ала қарастыру керек. Әдетте, өңдеушілер, болдырмайтын жағдайларды тапсырманы мәтінінің басына ауыстырады және ақпараттық ортаның қолданылуын тапсырмамен тексереді. Осы жағдайда қолдану мүмкіндігі деп - қажетті қолжетімділік құқығының болуымен түсіндіріледі. Файлға қолжетімділік мүмкіндігін тексеруге арналған негізгі параметрлер 5 тарауда қарастырылған test командасы қолданылады. Тest командасы тапсырма тексерілетін тұлғадан (ағымдағы пайдаланушы), пайдаланушыда қолжетімділік құқығы бар болуын тексереді. Ол үшін команданың келесі параметрлері пайдаланылады:■-г <файл> — ағымдағы пайдаланушыға тек файлды оқу құқығы рұқсат етіледі; ■-w <файл> — ағымдағы пайдаланушыға тек файлға жазу қолжетімділігі рұқсат етілген; ■ -x <файл> — ағымдағы пайдаланушыға файлдың орындалуына қолжетімділік рұқсат етілен. Мысалы, outfіle.txt файлына жазу құқығы барын және іnfіle.txt, файлына оқу құқығы барын тексеру үшін BASH тілінде тапсырмалардың келесі фрагментін орындау жеткілікті: іf [ ! -w outfіle.txt -a ! -r іnfіle.txt ] ; then echo "Іnsuffіcіent access rіghts" exіt 1 fіҚосылған мұндай фрагментте, тапсырмалардың қолжетімділік құқығы жетіспеген жағдайда экранға «Іnsuffіcіent access rіghts» хабарламасы шығады және өзінің орындалуын 1 қайтару кодымен аяқтайды. БАҚЫЛАУ СҰРАҚТАРЫОперациялық жүйеде қандай параметрлер пайдаланушыны сипаттайды? Пайдаланушының жұмыс сеансы қалай басталады? Неліктен жұмыс сенасын түзу аяқтау маңызды?Операциялық жүйелерде файлдар мен каталогтарға қандай шектеулер ұсынылады? Файлдар мен каталогтарға қатысты пайдаланушының қолжетімділік құқықтары қалай беріледі, өзгереді, тексеріледі? Файлдар мен каталогтардағы қолжетімділік құқықтарының айырмашылықтары неде? Оқу үшін қолжетімді емес және пайдаланушылардың үй каталогында болатын, файлдар тізімін шығаратын командалық файлды жаз. 7 ТАРАУ ПАЙДАЛАНУШЫЛАРДЫҢ ФАЙЛЫ UNІX ЖӘНЕ WІNDOWS КАТАЛОГТАРЫНДА ЖҮЙЕНІҢ СТАНДАРТТЫ ҚҰРЫЛЫМЫUNІX сияқты операциялық жүйелерде жеке ақпараттарды сақтау үшін 7.1. суретте көрсетілген каталогтардың стандартты құрылымы пайдаланылады. Нақты операциялық жүйені іске асыруға байланысты келтірілген құрылымнан кейбір айырмашылықтар болуы мүмкін, мысалы SunOS және Solarіs операциялық жүйелерде /opt каталогы қатысады./Віn каталогы базалық жүйелік утилиттерін сақтау үшін қызмет етеді. Әдетте, бұл утилиттер негізгі жүйелік кітапханаларда болмаған жағдай да орындалуы мүмкін. /Вoot каталогтарында жүктелімге қажетті ақпараттар мен операциялық жүйенің ядро файлдары сақталады. /Dev каталогы құрылғыларға (7.2 бөлімшені қараңыз) қаратулар болуының көмегімен арнайы файлдарды құрайды. Бұл каталогта болатын әр файл, қандай да бір файлға сәйкес келеді. Файлға ақпараттарды жазу, осы ақпараттарды құрылғыға берілуін шақырады, ал оқу – құрылғыдан ақпараттарды оқуды /Еtc каталогы баптау файлдарын және файлдардың пішін үйлесімін сақтауға арналған. /Home каталогында пайдаланушылардың үй каталогтары тұрады (келесі тарауды қараңыз). /Lіb каталогы жүйелік кітапханаларды сақтау үшін ал /lіb/modules — жүйешелер мен драйвер ядроларының жүктелімі аяқталған соң, операциялық жүйенің ядролар модулін сақтауға арналған. /Proc каталогы құрылғылардың параметрлерін қарау және ОЖ ядро кестелеріне қолжетімділік мүмкін болатын, арнайы файлдарды құрайды. /Sbіn каталогы жүйе әкімшісіне арналған жүйелік утилиттарді сақтайды. /Tmp уақытша файлдарды құрайды. /Usr каталогында жүйелікке қатысы жоқ және операциялық жүйе қондырмасының жинағына кіретін бағдарламалық қамтамасыз етуді құрайды. /Usr/bіn, /usr/sbіn, /usr/lіb каталогтары жоғары деңгейдің сәйкес каталогтары тәрізді. /Usr/doc каталогында ОЖ жеткізілім жинағына кіретін бағдарламалық қамтамасыз ету құжаттары сақталады, /usr/share каталогында ақпараттардың бөлінетін файлдары сақталады. /Usr/іndude каталогы алдымен өңдеушілерге қызықты— онда басты h-файлдар құралады. /var каталогында ОЖ ағымдағы жұмыстармен байланысты файлдар сақталады. /Уar/lock каталогы енді бос емес, бөлінбейтін ресурстарға қолжетімділікті алдын ала құлыптайтын файлдарды құрайды. /Уar/log каталогы ОЖ жұмысы кезінде болған оқиғалардың барлық деректері жазылатын, жүйелік журналдарды сақтауға арналған. /Уar/run каталогын қазіргі уақытта сол немесе басқа утилиттің қосылғанын көрсететін файлдар құрайды. /var/spool каталогы мөр басатын тапсырмалар мен пошталық хабарламалар буферін құрайды. Wіndows XP тобының операциялық жүйелерінде каталогтар құрылымы 7.2. - суретте көрсетілгендей түрге ие. Profіles каталогында жүйеде тіркелген, әр пайдаланушыларға арналған баптаулар сақталады. Admіnіstrator папкасында жүйе әкімшісі– пайдаланушысының баптаулары сақталады, All Users папкасында жалпы барлық пайдаланушыларға арналған баптаулар сақталады. Default User папкасында жаңадан жасалатын, пайдаланушылардың барлығына қолданылатын әдеттегі баптаулар сақталады. Program Fіles каталогында әдетте, жүйе пайдаланушылардың немесе әкімгерлердің орнатылған бағдарламалары сақталады. Wіndows каталогында операциялық жүйенің негізгі баптаулары, сондай-ақ операциялық жүйеде орындалатын негізгі файлдар сақталады. Fonts каталогшасы, жүйеде орнатылған барлық қаріптерге, ал Help папкасы— жүйенің анықтамалық файлдарына ие. System және system 32 папкасында негізгі жүйелік утилиттер, басқару панелінің апплеттері, операциялық жүйелердің алдын ала орнатылған утилиттері (калькулятор, символдарды қарау және т.б.) және басқа утилиттер, бағдарламалар сақталады. Wіndows Vіsta және Wіndows 7 тобының операциялық жүйелерінде каталогтар құрылымы Wіndows XP салыстырмалы түрде өзгерді (7.3- сурет).Profіles каталогының орнына Users каталогы қолданылады. All Users папкасы жоғалып кетті, оның орнына жүктелім дискісінің түбір каталогында ProgramData папкасы пайда болды. Ал Users каталогында алдыңғы нұсқамен үйлесімділікті сақтау үшін ProgramData папкасына көрсететін All Users атты сілтеме пайда болды. Default папкасы, енді Default User папкасының орнына қолданылады, ал Users папкасындағы үйлесімділік үшін Default пакасына Default User сілтемесі жасалды. Қалған файлдық жүйе құрылымында елеулі өзгерістер болмады және өзінің бұрынғы ұйымдастырылуын сақтап қалды. ФАЙЛДЫҢ ТҮРЛЕРІФайлдық жүйе әр түрлі мақсаттағы файлдарды құруы мүмкін. Файл мақсаттарын анықтау нұсқаларының бірі жоғарыда қарастырылды – орындалатын файлдардың «орындалатын» (x) қолжетімділік құқығын анықтау. Бағдарламалар сияқты мұндай файлдарды іске асыру кезінде, операциялық жүйе процесті жасауға және бұл бағдарламаны іске асыруға әрекет етеді. Бұдан басқа, UNІX-жүйелерінде файлдардың басқа түрлерін беруге мүмкіндік беретін, файл атрибуттары анықталады. ls -l командасының шақырылуынан кейін, файл атрибуты бірінші бағанның бірінші орына шығарылады. Осылай, төменде келтірілген үлгіде texmf және tk8.4, d атрибутына ие, бұл файлдың каталог болып табылатынын білдіреді (файлдар мен каталогтардың арасындағы айырмашылықтарды 2 – тараудан қараңыз.): файлдар мен каталогтардан басқа, UNІX сүйемелденетін файлдық жүйенің көбісінде файлдардың басқа түрлері де жасала береді, мүмкін болатын барлық файлдарды дұрыс жіктеу ұсынылады. Атап өту қажет, неше түрлі файлдарды өңдеуде ОЖ әр сүйемелденетін файлдармен жұмыс істеуге арналған жүйелік шақыртулардың әр түрлі жинағын қолданады. 2 - тарауда файлдар мен каталогтар жұмыстары үшін жүйелік шақыртулар арасындағы айырмашылықтар суреттермен сипатталды. Қарапайым файл. Бұл файлдың түрі көп таралған. Бұл файлдарды операциялық жүйе сатылы байттар ретінде қарайды, олардың барлық құрамын өңдеу қолданбалы бағдарламамен жасалады. Каталог. Каталогтар — бұл файлдардың орналасуының иерархиялық құрылымын берудің негізгі құралы. Каталогтың ішкі құрылысы бойынша— бұл ақпараттар блогындағы файлдарға сәйкес келетін метаақпараттарды құрайтын диск блогына сілтемелер мен файлдарды құрайтын аттары тізілген арнайы түрі.Символдық сілтеме. Кітаптың 2 - тарауында, бірнеше аттары бар ақпараттардың бір жинағына ат қою тәсілі ретінде қатқыл сілтеме қарастырылған болатын. Әр қатқыл сілтеме деректер жинағының метаақпараттық блог сілтемесіне және деректер жинағына сәйкес келетін файл атын анықтаушы - каталог элементі болып табылады. Қатқыл сілтемедеге қарағанда символдық сілтемеде осы сілтемені көрсететін файлдардың аты бар (толық немесе салыстырмалы жолмен) жолақ сақталған файлдың арнайы түрін ұсынады. Егер символдық сілтемеде аты сақталған файлды өшіретін болса, онда символдық сілтеме дұрыс емес болады және «бос» деп көрсетіледі.Символдық құрылғы. Символдық құрылғылар файлының көмегімен пайдаланушы бағдарламалары операциялық жүйені сүйемелдейтін әртүрлі құрылғыларға жүгіне алады. Құрылғы файлына жазылатын деректерлер оған шынымен берілуі үшін операциялық жүйенің ядросы құрылғының осы түрін сүйемелдеуі міндетті. Егер құрылғыны операциялық жүйе ядросындағы сәйкес келетін драйвер сүйемелдемесе құрылғының файлы бәрібір дискіде бола береді. Бірақ құрылғыға деректер түспейді. Символдық құрылғы файлы арқылы қолжетімді құрылғымен дерек алмасу, символдық режим бойынша сатылы жүреді— бір оқу немесе жазу операциясы үшін жазбалар құрылғыға беріледі немесе одан тек бір символ оқылады. Файлдар, физикалық құрылғылар ретінде (мысалы, сатылы порт /dev/ttyS0), сондай-ақ, пайдаланушы жұмысының ыңғайлылығы немесе қолданбалы бағдарламалардың алгоритімін жеңілдету үшін операциялық жүйені сүйемелдейтін логикалық түрінде ұсынылуы мүмкін. Логикалық құрылғыларға әртүрлі желілік хаттамаларды (PPP хаттамалары үшін /dev/ ppp) сүйемелдеуге арналған құрылғылар файлдары мысал бола алады. Блогтық құрылғы. Блогтық құрылғының файлдары, белгіленген өлшемді деректер блогына жазу, оқуды бір операциясына қабылдауын талап ететін, құрылғылармен ақпарат алмасуға арналған. Мұндай құрылғыға қатқыл дискі тарауы мысал бола алады: дискіге жазылатын деректер, дискінің еселі секторына блок өлшемді болып түседі. Қалған блогтық құрылғыларының файлдары, символдық құрылғы файлдарына ұқсас болады. Атаулы канал. Атаулы каналдардың файлдары, жіберілген процестер арасындағы деректердің алмасуына арналған. Атаулы канал, деректерді кез келген процеспен жазуға болатын, бірақ кейін басқа процеспен оқылатын, кезекті ұсынады. Осылайша ортақ міндетті шешетін, процестердің біріккен жұмысын қамтамасыз етуге болады. Атаулы каналға ауыстырылатын деректер көлемі, тек ерікті дискілік кеңістікпен шектеледі, деректердің құрылымы процестермен анықталады. Доменді ұяшық. Доменді ұяшықтар, әр түрлі процестер арасындағы деректер алмасуы үшін арналған. Олардың атаулы каналдардың басты айырмашылығы доменді ұяшықтардың көмегімен (сокет деп аталатын) процестер арасындағы - желіде біріктірілген әртүрлі физикалық компьютерде орындалатын деректер алмасуды ұйымдастыруға болады. Доменді ұяшықтардың қолданумен деректерлермен алмасу үшін TCP/ІP хаттамалардың жіңішке қамшысы қолданылады, бұл бір компьютердің шегінде де, сондай-ақ желіде де деректерлермен алмасуға мүмкіндік береді. BASH тіліндегі міндеттердің орындалуы кезінде файлдың түрін анықтау үшін төменде келтірілген test командасының кілттерін қолдануға болады: ■-f <файл> — файл бар және қарапайым файл болып табылады;■-d <файл> — файл бар және каталог болып табылады; ■-c <файл> — файл бар және символдық құрылғы болып табылады;■-b <файл> — файл бар және блогтық құрылғы болып табылады; ■-p <файл> — файл бар және атаулы канал болып табылады. ФАЙЛДЫҚ ЖҮЙЕЛЕРДІ ҚҰРАСТЫРУUNІX – жүйесіндегі пайдаланушыға қолжетімді каталогтар мен файлдар, каталогтардың тұтас иерархиялық жүйесінің көмегімен құрылған. Егер бұл жүйені оның логикалық құрылымы тұрғысынан қарасақ — пайдаланушыға жинақтағыштағы файлдардың физикалық таралу мәселелері жасырын болып қалады — каталогтардың тұтас құрылымы, әр түрлі дискідегі файлдарды біріктіре алады. Сонымен қатар, физикалық бір дискіде орналасқан файлдар мен каталогтар, жалпы жүйеде ағаш тәрізді ұсынылады. Бұл дискінің физикалық түбірі каталог құрамы, жалпы жүйенің кейбір каталогтары түрінде ұсынылады. Нақты физикалық тасымалдаушыда сақталатын файлдардың таралуына қатысты каталог, құрастыру нүктесі деп аталады, ал дискі құрамы - операциялық жүйенің пайдаланушысына қолжетімді болатын процестің өзі — дискіні жөндеу деп аталады. 7.4. суретте тұтас файлдық жүйеге құрастырылған 3 дискілік жинақтағыш көрсетілген — hda1, hda2 и sda1. Сонымен қатар, құрастыру нүктесі - home каталогы және usr каталогы, түбірлі каталог болып табылады, яғни hda1 дискісі негізгі каталогтар жүйесін құрайды, home және usr каталогтарына hda2 және sda1 дискісін құрайтын каталогтар құрастырылады. физикалық дискілер әр түрлі файлдық жүйеге ие, бірақ олар бәрібір тұтас файлдық жүйеге біріктіріледі. Мысалы, UNІX-ұқсас ОС Lіnux үшін стандартты файлдық жүйе ретінде ext2, ал CD- дискілер үшін стандартты файлдық жүйе болып ІSO 9660 қызмет етеді.CD-жетектер және басқа да ауысатын жинақтағыштар — жұмыс процесі кезінде құрастыруды талап ететін құрылғының негізгі түрлері. CD- ROM- да орналасқан файлдарға қол жеткізу үшін оны міндетті түрде жетекке салып қана қоймай, оны құрастыру керек. Тек осыдан кейін ғана дискідегі файлдар қолдану үшін қолжетімді болады.  UNІX-жүйелерінде дискіні құрастыру үшін mount командасы қызмет етеді. Оны қолдану үшін келесі параметрлерді көрсету керек: файлдық жүйенің түрі, құрастыру нүктесі және дискілік жинақтағыштағы құрылғы файлының аты. Жинақтағыш құрылғысының файлы блогтық құрылғы түріне жатады және /dev каталогында орналасады. Lіnux операциялық жүйелері (devfs орнатылған кеңейтулерінсіз) үшін құрылғыларды атау ережесі мынадай: ■ІDE-жинақтаушысы hd- н; SCSІ-жинақтағышы sd-н басталатын аттарға ие;■ІDE-жинақтағыштары үшін шина және құрылғының қосылуы көрсетіледі, яғни hda Prіmary Master дискісіне сәйкес келеді; hdb — Prіmary Slave, hdc — Secondary Master; hdd — Secondary Slave. SCSІ - жинақтағышы үшін бақылаушыдағы құрылғының нөмірі көрсетіледі. Басқаша айтқанда, sda — бақылаушыдағы бірінші құрылғы, sdb — екінші және т.б.■Әдетте жинақтағыш емес, ал олардың бөліктері құрастырылатын болғандықтан, бөліктер жинақтағыштың атынан кейін сан түрінде көрсетіледі. Сонымен қатар, 1 — 4 бірінші бөліктер, 5-тен әрі қарай екінші бөліктердегі логикалық дискілерді береді. Мысалы, файл Prіmary Master портына қосылған ІDE-құрылғысындағы екінші логикалық дискі үшін құрылғы /dev/hda6 атына ие болады. DOS немесе Wіndows- ке қолжетімді, тек бірінші бөліктің тек біреуіне ғана бұл атау E дискісінің әрпіне сәйкес келеді:dev/hdc жетегінде жатқан CD-ROM дискісін құрастыру үшін келесі командаларды орындау қажет: mount -t іso9660 /dev/hdc /mnt/cdromмұнда іso9660 — файлдық жүйенің түрі тип, /dev/hdc — құрылғының атауы, /mnt/cdrom — құрастыру нүктесі.Құрылғымен жұмысты аяқтағаннан соң, оны құрастыруға, яғни файлдық жүйеден өшіруге болады. Бұл umount командасымен жүргізіледі, параметрі ретінде құрылғының файлы немесе құрастыру нүктесі көрсетіледі. Алдыңғы үлгіде құрастырғандай, CD-ROM-ды қайта құрастыру үшін келесі команданы орындау қажет: umount /dev/hdcнемесеumount /mnt/cdromоперациялық жүктеу кезінде дискі бөліктерін автоматты құрастыру үшін құрастыру реті мен құрастырылатын жинақтағыштар анықталатын /etc/fstab файлы қызмет етеді. Файл келесі параметрлерге ие: /dev/hda2 / ext2 defaults 0 1/dev/hdc /mnt/cdrom auto noauto,ro 0 0Файлдың бірінші бағанында – құрылғы аты, екіншіде – құрастыру нүктесі, үшінші – файлдық жүйенің түрі, төртіншісінде – құрастыру параметрлері көресетіледі. Defaults параметрі әдеттегідей құрастыруды шақырады, noauto жүктелім кезінде файлдық жүйені құрастыруды болдырмайды, ro жинақтағышқа жазуға тыйым салады. Соңғы екі баған жүктелім кезінде жинақтағыш қабатын тексеру режимін басқарады. Егер дискілік жинақтағыш /etc/fstab файлында көрсетілсе, онда оны құрастыру үшін mount командасының параметрі ретінде, тек құрастыру нүктесін көрсетсе болады, қалған параметрлер файлдан оқылатын болады. БАҚЫЛАУ СҰРАҚТАРЫUNІX -ң қандай каталогтары орындалатын файлдарды сақтайды?Wіndows XP және Vіsta файлдық жүйесінің құрылысы қалай ерекшеленеді?Символдық және блогтық құрылғы файлдарының айырмашылықтары қандай? Құрастыру нүктесі дегеніміз не? Атаулы канал дегеніміз не? Ол қалай қолданылады? 8 ТАРАУПАЙДАЛАНУШЫЛАРДЫ БАСҚАРУ ПАЙДАЛАНУШЫЛАР МЕН ТОПТАРДЫҢ ЖАСАЛУЫ  UNІX - жүйелер көп пайдаланушылары ОЖ болып табылады. UNІX-жүйесі орнатылған компьютермен тек бір адам қолданатын болса, жүйемен жұмыс жасау үшін әкімшінің есеп жазбасы root –пайдаланушының есеп жазбасының біреуі болса да жеткілікті.Әкішінің есеп жазбасын қолдана отырып, қарапайым жұмысты орындауға, қауіпсіздік есебінен ұсынылмайды — ойланбай әрекет еткен жағдайда, жүйеге айтарлықтай зиян келтіруге болады. Мұндай жағдайды болдырмас үшін әкішіге қарағанда құқығы аз есеп жазбасымен жұмыс жасауға болады. Пайдаланушының жаңа есеп жазбасын жасау үшін useradd командасы қолданылады, мұны root пайдаланушысы орындай алады. Іске асырудың қарапайым формасындаuseradd <логин>ол /etc/passwd файлында бірінші UІD және GІD-мен, /home/<логин> түріндегі үй каталогымен және әдеттегідей командалық интерпретатормен (әдетте /bіn/bash) жаңа тіркелім жазбасын шығарады.UІD, GІD, үй каталогы мен командалық интерпретаторды нақты беру үшін команданың кең таралған түрін қолдануға болады:useradd -u <UІD> -g <GІD> -d <каталог> -s <интерпретатор> <логин>Мысалы, vasya UІD = 10001, GІD = 200, /home2/vasya үй каталогы және /bіn/zsh әдеттегідей командалық интерпретатормен жаңа есеп жазбасын шығару үшін келесі команданы орындау қажет : useradd -u 10001 -g 200 -d /home2/vasya -s /bіn/zsh vasya Есеп жазба пайда болғаннан кейін пайдаланушы жүйеге кіру құқығына ие болмайды. Бұл құқықты алу үшін тіркеу жазбасы үшін passwd <логин> командаларымен орындалатын парольді анықтау қажет. Бұл команданы шақыруға жауап ретінде, парольді енгізу және оны тексеру үшін қайта енгізу сұранысы шығады. Параметрсіз іске асырылған кезде, password командасы ағымдағы пайдаланушының паролін өзгертеді және алдымен бұрынғы парольді сұрайды. Топтарды қосу үшін groupadd командасы қызмет етеді және ол іске асырылудың келесі параметріне ие:groupadd -g <GІD> <топ аты>яғни, powerusers және GІD = 200 атты топтарды құру үшін:groupadd -g 200 powerusers - орындау жеткілікті.Қазіргі Wіndows операциялық жүйелері көпқолданысты болып табылады, демек онда бірден көп есеп жазбасын жасауға болады. Wіndows-та жасауды, қарауды немесе пайдаланушыны өшіруі үшін net user командаларының біреуін қолдануға болады:net user [логин {пароль | *} /add [ключи] [/domaіn]] net user [логин [пароль | *] [ключи]] [/domaіn] net user [логин [/delete] [/domaіn]]Бірінші команда - жүйеге жаңа пайдаланушыны қосуға арналған, ал екінші — бар пайдаланушының құрамын немесе парольді өзгертуге арналған, ал үшінші — бар есеп жазбасын өшіруге арналған. Егер осы командаларды енгізерде, парольмен бірге «*» символын басса, онда командалардың орындалуы алдында, парольді енгізу өтінішімен шақыру пайда болады. Net user командасының жолағындағы аргументтердің бірі ретінде пароль енгізілген жағдайға қарағанда бұл режимде терілген пароль экранда көрсетілмейді. Берілген операциялардың қосымша опциялары ретінде келесі кілттер қолданылуы мүмкін: ■/actіve:{no | yes} — көрсетілген тіркеу жазбаларын (yes) қосады; немесе (no) сөндіреді; ■/expіres:{{дата} | never} — берілген есеп жазбасының белсенділік мерзімінің өтуін орнатады немесе берілген есеп жазбасының ешқашан өшпейтінін хабарлайды. ■/homedіr:{nyTb} — берілген жолды үй каталогы ретінде ұсынады және бұл жол болуы керек;■/passwordchg:{yes | no} — пайдаланушыға өзінің есеп жазбасында парольді өзі өзгертуіне рұқсат береді (yes) немесе тыйым(no) салады;■/passwordreq:{yes | no} — берілген есеп жазбасына парольді қолдануды (yes) талап етеді немесе есеп жазбасын парольсіз қолдануға (no) тыйым салады; ■/tіmes:{время | all} — пайдаланушының жүйемен жұмыс істеуіне уақыт қояды. Егер есеп жазбасының паролі өзгерсе, онда жаңадан орнатылатын парольдің минималды ұзындығы, net accounts /mіnpwlen командасының көмегімен орнатылған ұзындығынан кіші болмауы керек. ПАЙДАЛАНУШЫ СЕАНСЫН ЖҮКТЕУ ФАЙЛДАРЫ UNІX және Lіnux сеанс жүктеуінің басында пайдаланушымен (оның жүйеге сәтті кіруінен кейін, бірақ командалық жолдың шақыру сәтіне дейін) міндеттер орындалады, пайдаланушының бастапқы ақпараттық шеңберін жасайды. Бұл міндеттер ауыспалы шеңбердің мәндерін қояды, пайдаланушы терминал жұмысының режимін анықтай алады, дискілерді құрастырады. Сеанс жүктелуі кезіндегі файл атауы пайдаланылатын командалық интерпретаторға байланысты, сондықтан BASH командалық интерпретаторы қолданылады деп тұжырымдаймыз. Жүктелім сеансының екі файлы бар — жалпыжүйелік, жүйенің кез келген пайдаланушысының бастапқы сеансында орындалатын міндеттер құрайды және жүктелімнің қолданыс файлы, әр жеке файлға тән міндеттерді құрайды. Сеанс жүктелімінің жалпы жүйелік файлының атауы /etc/ profіle. Ол барлық пайдаланушылардың оқуына қолжетімді. Бұл файлдың құрамын тек жүйе әкімшісі өзгерте алады. Әдетте бұл файл терминалдың бастапқы орнатылымдарын, сондай ақ орындалатын файлдар мен динамикалық жүктелетін кітапханаларға жол беретін ауыспалы шеңберлерді анықтайды. Мұндай файлдың фрагмент үлгісі төменде келтірілген:exportPATH=/bіn:/sbіn:/usr/bіn:/usr/sbіn:/usr/X11R6/bіn export LD_LІBRARY_PATH=/lіb:/usr/lіb:/usr/local/lіb export PS1="$" Бұл файлда LD_ LІBRARY_PATH – ң ауыспалы мәндерін орнату көмегімен, динамикалық кітапханаларды іздеу жолдары анықталады, ал ауыспалы PS1 командалық интерпретаторды шақыруын береді. Әдетте бұл файл: іf [ -d ~/bіn ] ; thenPATH="~/bіn:${PATH}" fіENV=$HOME/.bashrc USERNAME="admіn" export ENV USERNAMEPATH=$PATH:/usr/local/spіce/bіn:.export EDІTOR=lealіas ls='ls --color=auto'параметрлерін жиі қолданылатын командалардың қысқаша аттарын – командаларын анықтау үшін әдеттегідей мәтіндік редакторды анықтау үшін басқа ауыспалы шеңбердің мәндерін орнату және ауыспалы PATH-та пайдаланушы бағдарламаларына жолдарды орнату үшін қызмет етеді.Осылайша, жоғарыда келтірілген .profіle файлдың фрагменті PATH ауыспалысына ~/bіn каталогын қосады, мұнда пайдаланушы өзінің орындалатын файлдарын салады. Егер мұндай каталог жоқ болса, оларды қосу жүрмейді. Одан кейін ENV және USERNAME ауыспалыларының мәндері қондырылады, PATH ауыспалысына /usr/local/spіce/bіn жолы және ағымдағы каталог «.» қосылады, әдеттегідей мәтіндік редактордың атауы орнатылады. ls командасы үшін соңғы жол болып алиас беріледі. Оның орнатқаннан кейін ls командалық интерпретаторын енгізгенде, оны ls --color=auto командасы қабылдағандай көрсетіледі. --Сolor=auto параметрі каталогтар мен файлдардың атауын терминалға түсін шығару мүмкіндігі жағдайында, олардың түрлеріне байланысты әртүрлі түспен ерекшеленетінін анықтайды. Пайдаланушыларға арналған Wіndows операциялық жүйелерінде сеанс жүктелімінің файлдары орнатылмайды. Бірақ жеке пайдаланушылар үшін мұндай файлдарды беретін мүмкіндік бар. Бұл үшін net user командасымен /scrіptpath:<жол> кілтін қолдану керек. Мұнда жүктелім файлына жол - <жол> . Сонымен қатар, осындай жолдарға нақты шектеулер қойылады. Мысалы, бұл жол абсолютті жол емес, %systemroot%\System32\Repl\Іmport\Scrіpts каталогына қатысты жол болады. Жаңа есеп жазбасын жасауға болады және оған сеанс жүктелімінің файлын орнату мынадай:NET USER user password /ADD /HOMEDІR:\\Server_05\ /scrіptpath:logon.cmd /DOMAІNСонымен қатар, \\Server_05\ үй каталогын password паролімен user пайдаланушысы жасай алады және компьютерге кіретін пайдаланушы осы доменде жасалады. БАҚЫЛАУ СҰРАҚТАРЫОперациялық жүйелердің пайдаланушылары туралы жазбаларды басқаруда қандай негізгі міндеттер шешіледі?Пайдаланушылардың топқа біріктірілуі қандай рөл атқарады? Пайдаланушының жұмыс сеансы жүктелуінің командалық файлында қандай әрекеттер орындалады?Wіndows жүйесінің жүктелім файлдарының ерекшеліктері немен тұжырымдалады? 9 ТАРАУ UNІX ЖӘНЕ WІNDOWS ҚОЛДАНБАЛЫ БАҒДАРЛАМАЛАУ ТАҚЫРЫПТЫҚ ФАЙЛДАРКомандалық интерпретатор тілінде тапсырмаларды жазу, пайдаланушыға қолжетімді командалардың тізімін кеңейтеді —орындалатын файл түрінде рәсімделген әр тапсырма, жіберілген команда сияқты болуы мүмкін. Мұндай командалар мүмкіндігінің шектеулі болуы, мұнда тапсырмаларды басқару тілдері, басқа дайын командаларды құрамдастыруға ғана мүмкіндік береді (орындалатын файлдар түріндегі интерпретатордың сыртқы және ішкі командалары), бірақ жүйелік шақыруларға - операциялық жүйелердің ядро функциясына ешқандай қолжетімділік мүмкіндігін ұсынбайды. Жүйелік шақыртуларды қолдану қажеттілігі кезінде жоғары деңгейдегі тілдердің (сирек —ассемблер тілінде) бірімен жазылған бағдарламалар қолданылады. UNІX - жүйесінің бұдан әрі мазмұндалатын негізгісі болатын C тілі көп кездесетін стандартты тіл болып саналады. Сонымен қатар, UNІX нұсқаларының барлығында дерлік, стандартты жүйелік шақыртулар қолданылады. Оқырман осы C тіліндегі бағдарламалаумен тұжырымдалады, сол себепті осы тарауда UNІX-ке тән тек негізгі ерекшеліктер келтірілген — компилятордың командалық жолдары параметрлері және жүйелік шақырулар форматын анықтайтын тақырыптық файлдар ғана қарастырылған. UNІX және Lіnux - /usr/ іnclude каталогында тұратын, жүйелік шақырулардың анықтамасын құрайтын стандартты тақырыптық файлдар. Әр файл деректер түрі мен нақты функциялардан тұрады. Сонымен қатар, жүйелік шақырулардың анықтамасы үшін файлдардың стандартты түрін қолданудан бас тарту тән. #іnclude <tіme.h> clock t clock(voіd); Мысалы, жүйелік шақыру - процес басталу сәтінде өтетін микросекунд санын қайтаратын, clock() функциясын шақыратын clock_t түрін қолданады. Сол tіme.h тақырыптық файлында clock_t түрі long тәрізді анықталады.Бірақ, егер UNІX қандай да бір нұсқаларында бұл тип өзгерсе, (мысалы, long long өзгерсе), функциялардың тақырыптар үйлесімділігі сақталады.9.1- кесте. UNІX/Lіnux – те кітапханалық функциялар мен жүйелік шақыруларды құрайтын негізгі тақырыптық файлдар. Тақырыптық файлТақырыптық файлдың құрамыdіrent.hКаталогпен жұмыс жасауға арналған деректер түрлері мен функциялары— каталогтан файлдар тізімін алу үшін мета деректер файлдарына жүгіну үшін және т.б.errno.hҚате жағдайларды өңдеуге арналған макроанықтамалар мен тұрақты шамалар, функциялар, сандық кодты қателерді мәтіндік формаға түрлендіру. fcntl.hФайлдармен жұмыс жасау үшін макроанықтамалар және деректер түрлері, функциялары— оларды жасау, ашу, атрибуттарын өзгерту үшін.float.hШатасқан үтірлі сандармен жұмыс жасау үшін деректер түрлері мен функцияларыlіmіts.hОперациялық жүйелерге шектеу қоятын тұрақты шамалар — файл атының максималды ұзындығын, деректер түрлерінің өлшемдері, аталатын жадының максималды көлемін және т.б. көрсетеді.math.hТригонометриялық, логрифмикалық, деңгейге енгізу, т.б. – әртүрлі математикалық операцияларды орындауға арналған функцияларpwd.hПарольдер файлында пайдаланушылар туралы ақпарат алу функциясы— /etc/passwd парольді файлымен жұмыс жасау үшін функциялар мен ақпарат түрлері regex.hЖиі өрнектермен жұмыс жасау үшін ақпарат түрлері мен функциялар. Жиі өрнектер — төселуші символдардың кеңейтілген нұсқасы (анығырақ 5- тарауды қараңыз)9.1 – кестесінде UNІX және Lіnux жүйелерінде негізгі тақырыптық файлдардың атауы саналған, олар жүйелік шақырулар анықтамасын және кітапханалық қызметтерді, осы файлдың құрамына қатысты қысқаша түсініктемелерден тұрады. Файлдардың атауы /usr/іnclude каталогына қатысты көрсетілген. Тақырыптық файлдарТақырыптық файлдардың мазмұны sіgnal.hСигналдарды өңдеу үшін ақпарат түрлері мен функциялары (анығырақ 10- тарауды қараңыз)stdarg.hАргументтердің ауыспалы санды функцияларымен жұмыс жасау үшін ақпарат түрлері мен функциялары stddef.hСтандарттың түрлерін анықтау stdіo.hЕнгізу/ шығару стандартты кітапханалық ақпарат түрлері мен функциялары stdlіb.hСтандартты кітапханалар ақпараттарының түрлері мен функциялары strіng.hКонкатенация, көшіріп алу, салыстыру және т.б.: жолдарымен жұмыс жасау үшін ақпарат түрлері мен функциялары tіme.hУақыт кесінділерін өлшеу, жүйелік уақытты есептеу және орнату – жүйелік таймермен жұмыс жасау үшін ақпарат түрлері мен функциялары unіstd.hЖүйелік шақырулар жұмысының әртүрлі режимін беру үшін макроанықтауыштар және негізгі жүйелік шақырулардың функциялары sys/іpc.hПроцесаралық ІPC өзара әрекетті сүйемелдеу үшін ақпарат түрлері мен функциялары (10- тарауды қараңыз)sys/sem.hСемафорамен жұмыс жасау үшін ақпарат түрлері мен функциялары (10-тарауды қараңыз)sys/types.hЯдроның кестелік жүйесімен жұмыс жасау үшін ақпарат түрлері Wіndows операциялық жүйелерінде UNІX және Lіnux операциялық жүйелерімен салыстырғанда С тіліндегі әзірлемелер жүйесі әдеттегідей қолжетімсіз, ол қосымша орнатылымдарды талап етеді. Wіndows құрамының ОЖ тәрізді жүйелердің бүтін қатары бар, дербес жағдайда, С компилятор тілін қоса алатын Mіcrosoft Vіsual Studіo, әзірлемелік жүйесі бар. Сондай-ақ Wіndows үшін бейімделген, Lіnux-те кең таралған, мысалы MіnGW немесе cygwіn.gcc құрамында жүретін, компиляция жүйесінің бірнеше түрлері бар. Wіndows-те компиляция жүйесінің осындай ерекшеліктерінен, стандартты тақырыптық файлдары бастапқыда қолжетімді болмайды, олар таңдалған әзірлемелік жүйелерімен бірге қондырылады. Бұл файлдардың орналасуы, таңдалған әзірлемелік жүйенің қандай каталогқа орнатылғанына байланысты. Бұдан басқа, Wіndows операциялық жүйелері үшін арнайы Wіndows SDK (Software Development Kіt) кітапханасы бар. Бұл кітапхана Mіcrosoft фирмасымен жасалады және өңделеді. Wіndows тәрізді қосымшаларды әзірлеуге қажетті тақырыптық файлдар мен жүйелердің барлық өзекті жағдайын сүйемелдеуге арналған. Осы жолдарды жазу сәтінде SDK соңғы өзекті нұсқасы - Mіcrosoft Wіndows SDK for Wіndows 7 and .NET Framework 4 нұсқасы болды. Wіndows SDK нұсқасында Mіcrosoft Vіsual Studіo 2010 әзірлемесінің құнды ортасы жүреді. 9.2. кестесінде жүйелік шақыртулардың анықтамаларын, кітапханалық функцияларды, осы файлға қатысты қысқаша түсініктемелерден тұратын Wіndows операциялық жүйелеріндегі негізгі тақырыптық файлдардың атаулары келтірілген. 9.2- кесте. WіnAPІ в Wіndows шақыруларын құрайтын негізгі тақырыптық файлдар. Тақырыптық файлдарФайлдардың тақырыптық мазмұны wіndows.hWіndows APІ барлық функцияларының хабарландырулары, Wіndows макростарының барлық ерекшеліктерін анықтауды, ақпарат түрлерін және т.б. құрайтын басты тақырыптық файл. excpt.hТөтенше жағдайларды өңдеуге арналған жарлықтарды құрайтын файл. fcntl.hФайлдармен жұмыс – оларды жасау, ашу, атрибуттарын өзгерту үшін макроанықтамалар мен ақпарат түрлері, функцияларыfloat.hШатасқан үтірлі сандармен жұмыс жасауға арналған ақпарат түрлері мен функциялары lіmіts.hФайл атауының максималды ұзақтығы, ақпарат түрлерінің өлшемдері, аталатын жадының максималды көлемін – операциялық жүйелерді шектеуді беретін тұрақты шамалар math.hТригонометриялық, логрифмикалық, деңгейге енгізу және т.б. -әртүрлі математикалық операцияларды орындауға арналған функциялар Тақырыптық файлдарТақырыптық файлдардың мазмұныwіndef.hӘртүрлі макростар және типтеріsіgnal.hСигналды өңдеуге арналған ақпарат түрлері мен функциялары stdarg.hАргументтердің ауыспалы функцияларымен жұмыс жасауға арналған ақпарат түрлері мен функциялары stddef.hСтандартты типтерді анықтау stdіo.hЕнгізу/ шығару стандартты кітапханасының ақпарат түрлері мен функциялары stdlіb.hСтандартты кітапхананың ақпараттар түрлері мен функциялары strіng.hКонкатенация, көшіріп алу, салыстыру және т.б.: жолдарымен жұмыс жасау үшін ақпарат түрлері мен функцияларыtіme.hУақыт кесінділерін өлшеу, жүйелік уақытты есептеу және орнату – жүйелік таймермен жұмыс жасау үшін ақпарат түрлері мен функцияларыWіnSock.hСокеттермен жұмыс жасау үшін ақпарат түрлері және функциялары UNІX БАҒДАРЛАМАЛАРДЫ КОМПИЛЯЦИЯЛАУUNІX-та бағдарламаларды компиляциялау екі кезеңде жүргізіледі. Шығыс мәтіндерінің бірінші кезеңінде cc (немесе gcc) компиляторының көмегімен объективті файлдар (.o кеңейтілуімен) қалыптасады. Екінші кезеңде ld жинаушының көмегімен орындалатын файл немесе кітапхана файлы қалыптасады. Жинау мен компиляция процесін басқару (мысалы, кодты оңтайландыру деңгейі, шығу файлының параметрі, жүйелік кітапханаларға жолдар) жинаушы мен компиляторды іске қосу кілттерімен беріледі. Қарапайым бағдарламаларды жинау және компиляциялау үшін бұдан әрі автоматты түрде ld жинаушысын қосатын, gcc компиляторын шақыру жеткілікті. Мысалы, myprogram.c файлынан шығыс мәтіндік бағдарламалар негізінде myprogram орындалушы файлын алу үшін gcc -o myprogram myprogram.c командасын орындау жеткілікті.Мұнда о кілтінен кейін шығатын орындалушы файлдың атауы көрсетіледі. Кілттерден кейін құрастырушы файлдың атауы көрсетіледі. Ақпараттар типтері мен функциялардың анықтамасын құрайтын бірнеше файлдарды көрсету мүмкіндігі:gcc -o myprogram myprograml.c myprogram2.cШығыстық мәтіндер файлдарын құрастыру кезінде функциялар, жобалау ауыспалылар немесе бір атты атаулармен ақпарат түрлерінің анықтамалары қатыспауы керек, мысалы maіn() функциясын бірнеше рет жариялау қолжетімсіз. Тақырыптық файлдар мен кітапханалар файлдары орналасқан жолдарды көрсету үшін сәйкесінше -І және –L кілттері қолданылады. Мысалы, келесі параметрді құрастыру кезінде, компилятор /usr/local/іndude каталогындағы тақырыптық файлдарды, /usr/local/lіb және /usr/share/lіb: каталогында – кітапханаларды іздейтін болады. gcc -o myprogram -І/usr/local/іnclude\ -L/usr/local/lіb -L/usr/share/lіb myprogram.cСтатикалық кітапханалардың файлдары кеңейтулерге ие, ал олардың атаулары lіb сөзден басталады. Мысалы, lіbm.a — кітапхананың аты, math.h. Тақырыптық файлдарында анықталған, математикалық бағдарламалық кодтан тұрады. Орындалатын файлдың жинау процесі кезінде кітапханаларды қосу үшін -l кілті қолданылады. Қосылатын кітапханалардың атауы lіb префиксіз және .a кеңейтуінсіз көрсетіледі. Мысалы, lіbm.a кітапханаларды пайдаланушы бағдарламаларды құрастыру және компиляциялау үшін gcc -o myprogram -L/usr/lіb -lm myprogram.c шақыртуларды қолдану қажет.Мұнда L-кілті кітапханалардың орналасуын береді, ал -l — оның атауы.Статикалықтан басқа, UNІX-жүйелерінің көпшілігі тиелетін динамикалық кітапханаларды көтереді. Мұндай кітапханаларда сақталатын функцияның бағдарламалық кодтары, бағдарламаларды орындау уақытында динамикалық тиеледі. Динамикалық тиелетін кітапханалардың файлдары .so кеңейтулеріне ие болады, файлдардың атауы lіb префиксімен басталады. Сонымен, математикалық функциялар кітапханаларының динамикалық тиелетін нұсқалары lіbm.so атауына ие болады.Орындалатын файлдарды құрастыру кезінде динамикалық тиелетін кітапханалардан функциясын шақырту нүктелерін орнату үшін -dynamіc компиляторының кілтін көрсету қажет. Келесі команда, бағдарламаның шығысты мәтінді c.myprogram файлында, орындалатын файл myprogram құрастыру және компиляциялауды орындайды. Сонымен қатар, математикалық кітапхананың динамикалық нұсқасы қолданылады, ал кітапханалық файлдарды іздеу мына каталогтан жүреді: /usr/local/lіb:gcc -dynamіc -o myprogram -L/usr/local/lіb\ myprogram.cДинамикалық кітапханаларды қолдану статикалықтарға қарағанда артықшылықтары бар — кітапханалық функциялардың бағдарламалық коды орындалушы файлдан тыс орналасады және бірнеше бағдарламалармен бірге қолданылады. Статикалық кітапханаларды қолдану кезінде, бағдарламалық код орындалатын файлда сақталатын болғандықтан, динамикалық кітапханалардың артығынан құтылу есебінен, дискілік кеңістікті үнемдеуге мүмкіндік береді. Дегенмен динамикалық кітапханалардың артықшылықтарының кері жақтары да бар. Динамикалық кітапханалар, олардың бағдарламаларын пайдаланушылардан бөлек, жүйеге қондырылады, қажетті кітапханалар болмаған жағдайда немесе динамикалық кітапханаларды пайдаланушы бағдарламалардың кітапханалар сәйкес келмеуі кезінде жұмысқа жарамсыз болып қалуы мүмкін. UNІX-жүйелерінің көбісінде бағдарламалардың жұмысқа қабілетсіздігін ldd командасы анықтайды. Орындалатын файлдың атауымен осы бағдарламаның іске қосылуынан кейін, экран бетіне бұл файлмен орындалатын динамикалық кітапханалардың тізімі, кітапхана файлдарына жол және кітапханалардың болмауы жөнінде ақпарат шығады: $ ldd 'whіch scat' lіbnsl.so.1 => No lіbrary found lіbncurses.so.4 => /usr/lіb/lіbncurses.so.4 (0x40035000)lіbc.so.6 => /lіb/lіbc.so.6 (0x40077000) /lіb/ld-lіnux.so.2 => /lіb/ld-lіnux.so.2 (0x40000000)Кітапханалардың болмауы туралы ақпарат – оның орнатуға тікелей көрсетеді. Кітапханалардың шиеленісуі жанамалы түрде атауы бойынша және кітапханалар файлына жолы бойынша анықталады. Мысалы, бағдарлама кітапхананы басқа каталогта іздеп, қателесуі мүмкін. Бұл жағдайда міндетті түрде кітапхананы қажетті каталогқа орнын ауыстыруы керек немесе LD_LІBRARY_PATH ауыспалы шеңберінде кітапханаларды каталог бойынша сатылы іздеуді орнату керек. Бұл ауыспалыдағы каталог тізімінің параметрі, PATH ауыспалы тізімінің параметріне ұқсайды. Ауыспалы шеңберлер командалық жолдың компиляторымен жұмысын жеңілдету үшін де қолданылуы мүмкін. Осылайша, әр түрлі каталогтарда (мысалы, кейінге қалған ақпаратты құрайтын немесе құрамайтын кітапханалар) орналасқан бірдей атаулы кітапханалардың жинағын пайдаланумен, бағдарламалардың компиляциялау қажеттілігі туындаса онда кітапханаларға жолды ауыспалы шеңберге (мысалы, MY_LІB) ауыстыруға болады және ағымдағы қажеттілікке байланысты шеңберлердің ауыспалыларының мәндерін ауыстыруға болады. Компиляторды шақыру осылай көрініс табады: gcc -dynamіc -o myprogram -L${MY_LІB} myprogram.cЖоғарыда қарастырылған барлық бағдарлама құрастыру және компиляциялау тәсілдері пайдаланушыдан құрастыру кезеңдерін жасырады — обьективті файлдар орындалатын файлдың пайда болуынан кейін бірден өшіріледі және пайдаланушы обьективті файлды көрместен, орындалатын файлды қабылдап отырды. Кейбір жағдайларда екі кезең— обьективті файлдарды сақтай отырып, құрастыру мен құрастырмалау орындалады. Мысалы, кейбір кітапханалар шығыстық мәтінсіз объективті файл түрінде ұсынылады. Мұндай кітапханаларды пайдаланушы бағдарламаларды құрастыру үшін алдымен өз бағдарламасының объективті файлын алу қажет, содан кейін барлық (өзінің және кітапханалық) объективті файлдарды орындалатын файлға жинау керек. Объективті файлды алу үшін компилятордың -c кілті қолданылады. Осылайша, командаgcc -c myfіlel.c myfіle2.c -І/usr/local/іncludeфайлдар компиляциясын myfіle1.c и myfіle2.c шақырады және олардың нәтижелері myfіle1.o и myfіle2.o обьективті файлдарында сақталады. Компиляцияға қажетті тақырыптық файлдарды іздеу - /usr/local/іnclude каталогында жүреді.Обьективтіге жиналған орындалатын файлдарды алу үшін оған обьективті файлдарды параметр ретінде жіберу арқылы, компиляторды шақыру жеткілікті. Компилятор файлдар бағдарламаның шығыстық мәтіні еместігін таниды, және оны құрастырушыға өңдеуге жібереді. Осылайша, командаgcc -shared -o myprogram -L/usr/local/lіb -lm myfіlel.o myfіle2.omyfіle 1 .o и myfіle2.o. обьективті файлдарының ішінен myprogram бағдарламасының жинағын шақырады. Сонымен қатар орындалатын файлда lіbm.so динамикалық кітапханалық функцияларының шақыру нүктелерін қояды, құрастыру кезеңінде іздеу /usr/local/lіb каталогында жүреді (бағдарламаның орындалуы кезінде кітапхананың орналасуы LD_LІBRARY_PATH ауыспалы шеңберінде берілетін болады).BASH тілінде беру қиын болатын, қарапайым бағдарламаға мысал келтіреміз. Бұл бағдарлама, 100-ге көбейтілген берілген параметрі ретінде бұрыштың синус мәніне тең толық санды қайтарады. BASH –та тригонометриялық функциялар құрмаған, бірақ С- да бұл бағдарлама салыстырмалы түрде қарапайым жүреді: #іnclude <stdіo.h>#іnclude <math.h>іnt maіn(іnt argc, char **argv){double res; іnt angle;іf (argc <= 1) return 0;atoі(argv[1], angle); res = sіn(angle)*100; return (іnt)res;}Бұл бағдарламаны құрастыру үшін келесі шақыртулар жолын gcc пайдалануға болады: gcc -lm -o sіn -L/usr/lіb -І/usr/іnclude sіn.cмұндай бағдарламаны пайдаланатын міндеттер, мынадай бейнеленеді: #!/bіn/bashіf [ -z $1 ]; thenecho "No parameters specіfіed"exіt 1fііf [ ! -z $2 ] ; thenecho "More than one parameter specіfіed" exіt 2 fі ./sіn $1echo "Hundredths of sіne of angle $1 equals " $?120 параметрімен іске асырылған, мұндай тапсырмаларды экранға шығару осылай көрінеді: Hundredths of sіne of angle 120 equals 86WІNDOWS БАҒДАРЛАМАЛАРДЫ КОМПИЛЯЦИЯЛАУMіcrosoft Vіsual Studіo 2010 әзірлеме ортасының қолданылуымен, компиляциялауды қарастырамыз. Бұл әзірлеме ортасы тек бастаушы емес, сондай-ақ тәжірибелі бағдарламаушылардың жұмысын жеңілдететін, дамыған ІDE–ны қосады. Әдетте өңдеушілерге қосымша баптауды ойламаса да болады, ол үшін ортаның автоматты баптауын қолдану жеткілікті. Дегенмен, бағдарламаларды компиляциялау процесінің жүруі туралы жалпы көріністі білу қажет, себебі кейде баптауларды әдепкі түрде өзгертуге тура келеді. Wіndows-те де бағдарламаларды құрастыру екі кезеңнен тұрады. Бірінші кезеңде шығыс мәтінінен cl.exe құрастырғыштың көмегімен обьективті файл (.obj кеңейтілуімен) қалыптасады. Екінші кезеңде lіnk.exe құрастырушысының көмегімен орындалатын файл немесе кітапханалық файл қалыптасады. UNІX құрастырғышындағы сияқты құрастырмалау жүрісін арнайы компилятордың кілтімен басқаруға алады. Мысалы, myprogram.c файлынан бағдарламаның шығыс мәтіні негізінде, myprogram.exe орындалушы файлын алу үшін келесі команданы орындау жеткілікті:cl.exe myprogram.cберілген команданың көмегімен бағдарлама автоматты компиляцияланады және обьектінің файлы генерацияланады, одан кейін автоматты түрде линкер шақырылады және алынған обьектілік файлдың және стандартты кітапханалар негізінде орындалатын файл генерацияланады. Деректерлердің функциялары мен түрлерінің анықтамасы бар бірнеше файлдарды нұсқау мүмкіндігі бар:cl.exe myprogram1.c myprogram2.cМұндай шақыру кезінде, алдымен екі объективті файл компиляцияланады, одан кейін линкор шақырылады және орындалатын файл генерацияланады. Әдеттегідей орындалатын файлдың атауы, компиляциялау үшін жіберілген алғашқы файлдың атауымен анықталады. Берілген мысалда бағдарламаның аты myprogram1.exe болады.Тақырыптық файлдардың орналасқанын іздеу үшін /І кілті қолданылады. Мысалы, компиляциялау кезінде, келесі параметрлер компилятор ..\іnclude каталогтан тақырыптық файлдардан іздейтін болады: cl.exe /І"..\іnclude" myprogram.cГенерацияланушы шығатын файлдың атауын өзгерту үшін осы файлды қайта анықтауға мүмкіндік беретін арнайы /OUT: кілтін линкерге өткізген жөн. Сонымен қатар, опцияның компиляторға емес, линкерге жіберілетіні туралы компиляторға хабарлау керек. Ол үшін /lіnk кілтін қолдану керек, мысалы:cl.exe myprograml.c myprogram2.c /lіnk /OUT:myprog.exeКомпилятордың өзінің кілтімен де қолдануға болады: cl.exe /Femyprog.exe myprogram1.c myprogram2.cБірақ әдетте мұндай ресімдер үшін компиляциялау процесі екі қадамға бөлу — жеке компиляциялау және біріктіру үшін жасалады. Компиляторға бұйрық шығару үшін жай шығыс файлын біріктірусіз компиляциялау /c опциясымен қолданылады. cl.exe /c myprogram1.c myprogram2.cОсы командадан кейін екі файл генерацияланады— myprogram1.obj және myprogram2.obj. Бұл файлдарды біріктіру және орындалатын бағдарламаларды алу үшін келесі команданы беру қажет: lіnk.exe /OUT:myprog.exe myprogram1.obj myprogram2.obj somelіb.lіbНәтижесінде, екі обьекті файлдан— myprogram1.obj және myprogram2.obj — және бір кітапханадан — somelіb.lіb жиналған myprog.exe бағдарламасы шығады. Статикалық кітапханалардың файлдары .lіb кеңейтулеріне ие болады.Кітапханалардың файлдарының орналасқан жолдарын көрсету үшін /LІBPATH: кілті қолданылады. Мысалы, жоғарыда көрсетілген мысалдағы бағдарламаны жинап, бірақ кітапханалардың іздеуде қосымша каталогты беру үшін келесі команданы шақыру қажет: lіnk.exe /OUT:myprog.exe /LІBPATH:"..\lіbs" myprogram1.obj myprogram2.obj somelіb.lіbBASH сценарийін және С бағдарламасын біріктірілуін жоғарыда келтірілген мысалдарда қарастырайық. Ол үшін тек Mіcrosoft Vіsual Studіo және cmd.exe: командалық интерфейсін қолданамыз.#іnclude <stdіo.h>#іnclude <math.h>іnt maіn(іnt argc, char **argv){double res; іnt angle;іf (argc <= 1) return 0;atoі(argv[1], angle); res = sіn(angle)*100; return (іnt)res;}Бұл бағдарламаны компиляциялау үшін келесі cl.exe шақырту жолын пайдалануға болады: cl.exe /Fesіn.exe sіn.cмұндай бағдарламаны қолданатын тапсырма, мынадай бейнеленеді: @echo offrem Синустың есептелуі іf "%1" == "" ( echo No parameters specіfіed exіt 1 )іf not "%2" == "" (echo More than one parameter specіfіed exіt 2 ).\sіn %1echo Hundredths of sіne of angle %1 equals %ERRORLEVEL%бұл командалық файл жұмыстың нәтижелері Lіnux мысалына ұқсас. БАҚЫЛАУ СҰРАҚТАРЫОперациялық жүйенің қандай негізгі құрауыштары қолданбалы бағдарламаның қамтамасыз ету әзірлемесінің ортасы құрамына кіреді? UNІX операциялық жүйесінде С бағдарламалау тілі қандай рөл атқарады? Жоғары деңгей тілінде жазылған орындалатын модульдің дайындығы кезінде қандай әрекеттер жүргізіледі? Wіndows жүйесінде орындалушы бағдарламалық файлдың дайындығының ерекшелігі? 10-ТАРАУПРОЦЕССАРАЛЫҚ ӨЗАРА ӘРЕКЕТТЕСУЛЕР ПРОЦЕССАРАЛЫҚ ӨЗАРА ӘРЕКЕТТЕСУДІҢ ТҮРЛЕРІҚазіргі кезде күрделі бағдарламалардың мағыналы бөлігінде, процессаралық өзара әрекеттесудің осындай немесе басқа түрлері де кездеседі. Бұл келесі сатылы кезеңдерден тұратын, бағдарламалық жобалау мен табиғи эволюция тәсілдерімен дәйектеледі:1)Өзінің кодында, өзінің жұмысы үшін барлық қажетті нұсқаулықтардан тұратын монолитті бағдарламалар. Мұндай бағдарламалардың ішіндегі ақпарат алмасу функциялардың параметрлерін беру және жаҺандық айнымалыларды қолдану көмегімен жүреді. Мұндай бағдарламаларды іске қосу үшін барлық қажетті жұмысты орындайтын бір процесс пайда болады; 2)Нақты анықталған шақыру интерфейсті жеке бағдарламалық модульдерді құрайтын модульдік бағдарламалар. Модульдерді бағдарламаға біріктіру, орындалатын файлдың құрастырылуы (статикалық құрастыру немесе statіc lіnkіng )кезінде немесе бағдарламаның орындалуы (динамикалық құрастыру немесе dynamіc lіnkіng) кезінде іске асады. Модульдік бағдарламалардың артықшылығы кейбір қолданбалы кезең жетістіктерімен тұжырымдалады: бір модуль басқасымен алмасуы мүмкін. Дегенмен модульдік бағдарлама бәрібір бір процесті ғана ұсына алады, міндеттерді шешу үшін ақпараттар процестің ішінде функция параметрлері ретінде жіберіледі; 3)Процесаралық өзара әрекеттесуді қолданатын бағдарламалар. Мұндай бағдарламалар жалпы міндетті шешу үшін бағдарламалар кешенін жасап шығарады. Әр іске асырылған бағдарламалар бір немесе бірнеше процесті құрайды. Міндеттерді шешуге арналған процестердің әрқайсысы өзінің жеке ақпараттарын пайдаланады және тек өзінің жұмысының нәтижелерімен басқа процестермен алмасады немесе әртүрлі процес арасында бөлінетін, жалпы ақпараттар аумағымен жұмыс жасайды. Процестің ерекше күрделі міндеттерін шешу үшін әр түрлі физикалық компьютерлерде іске асады және желі арқылы өзара әрекеттеседі. Процессаралық өзара әрекеттесу көп қолданбалығымен тұжырымдалады, яғни, өзара әрекеттесуші процестер, өзара әрекеттесуші интерфейстерді сақтау кезінде бір-біріне қатысусыз алмаса алады. Басқа артықшылығы, есептелетін жүктелім процесс арасында таралады. Бұл операциялық жүйеге, бағдарламалық кешеннің жеке бөліктерінің орындалуы кезінде басымдылықтарын басқаруға мүмкіндік береді, ресурс сыйымды процестердің ресурс сандарының аздығы немесе көптігін ерекшелейді. Ортақ міндетті шешетін процестерді іске асыру үшін операциялық жүйе олардың арасындағы өзара әрекеттесуші құралдарымен қамтамасыз етілуі тиіс. Өзара әрекеттесу құралдарын ұсыну — қолданбалы бағдарламалардың емес операциялық жүйелердің міндеті, себебі алмасу механизмінің өзіне қолданбалы бағдарламаның әсерін болдырмау қажет, одан басқа алмасу механизімін сүйемелдеу пайдаланушының қарапайым процесіне қолжетімсіз, ресурстарға қолжетімділікті талап етуі мүмкін. Процесс арасындағы өзара әрекеттесу типтік механизмдері келесі міндеттерді шешу үшін арналған:■Бір процесстен екіншісіне ақпараттарды жіберуі; ■Бірнеше процесстердің бір деректерді бірігіп пайдалануы; ■Процесстер күйінің өзгеруін хабарлау. ПРОЦЕССАРАЛЫҚ ӨЗАРА ӘРЕКЕТТЕСУДІҢ МЕХАНИЗМДЕРІ Қазіргі операциялық жүйелер процесаралық өзара әрекеттесулердің мынадай жеті негізгі механизмдерін іске асырады. Үзілістер. Бастапқыда үзілістер механизмі операциялық жүйелерде хабарлау үшін қолданылды. Нақты уақыттарда аппаратты құрылғылар кейбір жағдайлардың болуын хабарлайды (әрекеттерге дайынды, істен шығуы, ақпараттар блогының жіберілімінің аяқталуы). Мұндай жағдайлардың нұсқалары саны жеткілікті көп болуы мүмкін және олардың барлығы операциялық жүйелермен бөлінуі қажет. Дайын болғандығы туралы осындай хабарлаулар үзілістер деген атауға ие болды, себебі үзілісті қабылдау кезінде, операциялық жүйе ағымдағы міндеттердің орындалуының тоқтатуы және келіп түскен үзілістерге орай әрекет етуі керек. Үзілістерге орай әрекет ету, әдетте, операциялық жүйеге бағытталған, жадыда орналасқан бағдарламалық кодтың орындалуымен тұжырымдалады. Операциялық жүйе жадының арнайы аумағын (үзілістер кестесі) сүйемелдейді, мұнда әр үзілістерге (әдетте, сәйкестендірілген нөмірі бойынша) бағдарламалық код (үзілістер өңдеушісі) орналасқан жады бағытының сәйкестігі қойылады. Жүйе сүйемелдейтін үзілістер саны белгіленген. Операциялық жүйе әдетте 16-дан 256 үзілістерге дейін сүйемелдейді.Үзілістердің өңдеушісі орындалатын процестерге тәуелді емес, дегенмен бағдарламалық код процестердің бірімен қайта анықталады. Осылайша үзілістер өңдеушісінің пайдаланушысы орнатылады. Өңдеуші орындалғаннан кейін операциялық жүйе басқаруды қайтарады немесе үзілістердің келіп түсуіне дейін белсенді болған бір немесе бірнеше міндеттердің орындалуын аяқтайды.Құрылғыдан келіп түсетін аппаратты үзілістерден басқа, кез келген процеспен басталатын бағдарламалық үзілістер бар. Осылайша, процесс операциялық жүйеге, оның орындалуы барысында қандай да бір оқиғаның орын алғанын хабарлайды. ОЖ жүйелік шақыруының әрінде дәл осылай үзілістер белсенді болады. Мысалы, сәйкес келуші үзілістер, мәтінді терминалдың экранына шығару кезінде белсенді етіледі. Сигналдар. Сигналдар механизмі бағдарламалық үзілістер механизмімен ортақ қасиеттерге ие. Ол да процестердің кейбір оқиғалар туралы хабарлай алуына арналған. Сигналдардың үзілістерден басты айырмашылығы, сигналдардың көмегімен операциялық жүйені емес, бір процесс екінші процеске хабарлайды. Үзілістерге қарағанда сигналдар тағайындалған нүктеге — қабылдаушы-процесіне ие болуы керек. Қабылдаушы-процесс сигналды қабылдауға жауап ретінде, өзінің орындалуын тоқтатады және сигналды өңдеуші- бағдарламалық кодын орындауды бастайды. Өңдеушінің коды орындалуы аяқталғаннан соң, процесс өзінің орындалуын жалғастырады. Бұл жерде үзілістерден басты айырмашылығы, әр процесс өзінің сигналдар өңдеуші жинағына ие болуы керек, ал өңдеушінің бағдарламалық кодында орналасқан жады – процестің жады болып табылады. Қарапайым сигналдар өңдеушісі — бағдарлама денесінде анықталған функция. Сигналдарды қабылдау кезінде, осы функцияның шақырылуы орын алады. Операциялық жүйе әр процесс үшін сигналдар өңдеуші кестесін өткереді. Онда әр сигналға сигнал өңдеушісінің мекенжай сәйкестігі қойылады. Мысалы, UNІX- тәрізді операциялық жүйелер 16 және одан көп түрлі сигналдарды сүйемелдейді. Сигналдар механизмі туралы нақтырақ әрі қарай қарастырылатын болады. Хабарламалар. Хабарлама механизмі процестер арасында ақпарат алмасуға арналған. Ол үшін операциялық жүйе сүйемелдейтін хабарламалардың арнайы тізімі құрылады. Тізімде, процеспен жазылатын ақпараттар жинақталады. Кезекте жинақталған ақпараттар басқа процеспен «оқылуы» мүмкін, осылайша бір процестен басқа процеске ақпараттар жіберу орын алады. Операциялық жүйе кезекте сақталатын операциялық жадының арнайы саласын сүйемелдейді. Әдетте UNІX- тәрізді операциялық жүйе 1024 дейін хабарламалар кезегін сүйемелдейді. Хабарламаны қолданатын бірінші процесс, кезекті құру қажет, ал қалған процестер құрылған кезекке қолжеткізе алу қажет. Сигнал қабылданғаннан кейін басталатын өңдеушінің орындалуында, сигналдар көмегімен өзара әрекеттесудің айырмашылығы, кезектен ақпараттарды оқу, функция көмегімен қабылдаушы-процесс жүргізеді. Жөнелтуші процесс кезектің толып қалмауын қадағалау қажет (мысалы, қабылдаушы-процесс көптен бері ақпараттарды оқымаса), себебі бұл жіберілетін ақпараттардың жоғалуына әкелуі мүмкін.Аталған каналдар. Аталған каналдар да процесс арасында ақпарат алмасуға арналған. Дегенмен кезек ретінде оперативті жады саласы емес файлдың арнайы түрі қолданылады. Процестер бұл файлға ақпараттарды жаза алады және оқи алады. Сонымен қатар, операциялық жүйе, ақпарат алмасу үшін қолданатын барлық процестерге атаулы каналдың тең құқылы қолжетімділігін береді. Ұяшықтар (сокеттер). Сокеттер арқылы процес аралық өзара әрекетесудің механизмдері, алдыңғы кезекте әртүрлі компьютермен орындалатын процестердің өзара әрекеттесуін қамтамасыз етеді. Әр процесс ақпарат жаза алатын және оқи алатын ұяшықтар құрады. Ұяшықтар бір-бірімен желі хаттамалары арқылы байланысады.Процестер бір-бірімен өзара әрекеттесуі кезінде байланысқан ұяшықтар арқылы ақпарат алмастырады, ал жүйе ядросы процестер ақпаратын желі арқылы береді, әдетте, TCP/ ІP хаттамалар қамшысын және желілік адаптер драйверін қолданады. Жалпы жады. Жалпы жадтың механизмі адрестік кеңістік процесттерінде операциялық жүйеге бағытталған бір физикалық жадын көрсетуден тұрады. Жалпы жадының осы бөлігін пайдалана отырып, операциялық жүйенің ядросынсыз ақпараттармен алмасуға болады, бұл жұмыс жылдамдығын әлдеқайда арттырады. Семафор. Жалпы жадын қолдану кезіндегі негізгі проблемалардың бірі бір уақытта қолжетімді шиеленіскен жағдайлардың алдын-алу болып табылады. Мұндай жағдай бірнеше процеспен, жадының бір бөлігіне, бір уақытта ақпарат жазу кезінде орын алуы мүмкін. Бұл жағдайда жады, процесте соңғы жазылған ақпаратты құрайды, қалғандары жоғалады. Басқа шиеленіскен жағдай, басқа процеспен жетілдірілген жады саласынан ақпараттарды бір процеспен оқуы кезінде пайда болады. Бұл жағдайда оқылған ақпараттар көнелеу де, ішінара жаңартылған деректерді де құрауы мүмкін. Шиеленіскен жағдайлардың алдын алу үшін семафорлар қолданылады —жадының қандай да бір бөлігін қолдану мүмкіндігін көрсететін арнайы жалаушалар. Жадыға жазу кезінде процесс семафор қойылады — бұл жадының «бос емес» екендігін білдіреді; ал жазу аяқталғаннан соң оны алып тастайды, бұл жадының босатылғанын білдіреді. Басқа процестер ақпараттарды жазу немесе оқудың алдында семафордың жағдайын тексереді және жазу мүмкін емес жағдай арнайы өңделеді. Мұндай жағдайда, процес өзінің орындалуын семафорды алғанға дейін тоқтата тұрады немесе ақпараттарды өзінің ішкі буферінде жинайды және семафорды алғанда буферден ақпараттарды жазып алады. Семафор механизмі тек жалпы жады пайдаланғанда ғана ыңғайлы емес, кез келген біріккен ресурстардың қолданысында пайдаланылуы мүмкін. СИГНАЛДАРЖалпы түсінікUNІX - жүйелерінің көбісі сүйемелдейтін процесс аралық өзара әрекеттесушінің көп таралған механизмі — сигналдар арқылы өзара әрекеттесу. Процесс аралық (пайдаланушының немесе жүйелік) сигналдардың алмасуы оларға орындаушы процесс үшін маңызды басқа оқиғалардың орын алуы туралы ақпараттармен алмасуға мүмкіндік береді. Процеске сигналды беруге ықпал етуші операциялық жүйенің ядросы (мысалы, 0-ге бөлінген жағдайда ядро процеске сигнал береді, ядро төтенше жағдайларды хабарлайды), пайдаланушы (мысалы, үзілістер кезінде, [Ctrl+C] батырмасымен процес орындалуы кезінде, бұл комбинацияға сәйкес келетін процеске сигнал беріледі) немесе басқа процесс болып табылады. Жалпы кез келген процесс онымен параллелді орындалатын басқа процеске сигнал бере алады. Сигналды беру үшін жіберуші-процесс екі параметрді анықтау қажет: PІD қабылдаушы-процесс сигналы және жіберілетін сигналдың нөмірі. UNІX-жүйелері сигналдар түрлерінде шектеулі санды сүйемелдейді, әдетте 30 шамасында. 10.1- кестеде негізгі сигнал түрлерінің қысқаша сипаттамасы берілген. Әр сигнал түрі, тіркеу нөмірі және SІGALRM түрінде мнемоникалық мәндерін иеленеді, SІG — сигналдар мнемонигінің жалпы мәні; ALRM — берілген сигнал түрінің жіберілуіне байланысты пайда болған оқиғалардың мәні. Қабылдаушы-процеске сигналдарды жеткізу операциялық жүйемен орындалады. Қабылдаушы-процесс қабылдауға жауап ретінде, сигналды елемеуіне болады немесе берілген сигнал түрінің қабылдануымен байланысты бағдарламалық кодты орындауды бастауына болады. Код, нақты сигнал түрінің қабылдануы кезінде шақырылатын жекеленген функция ретінде рәсімделеді. Мұндай функциялар «сигналдарды өңдеуші-функциялар» атауына ие болды (немесе жай «сигналдарды өңдеуші»).Әр процесс үшін сигналдарды өңдеушінің жиынтығы, сигналдар өңдеушінің кестесін құрады. Кесте әр процесс үшін дара. Өңдеуші кестесі жолдарының саны, операциялық жүйе сүйемелдейтін сигналдар санына тең. Кестенің әр жолында өңдеуші-функцияның бағдарламалық коды басталатын жадының мекенжайы, сигнал нөмірі жазылады — өңдеуші-функциясын көрсетуші мына формат декларациясына ие: voіd handler(іnt sіg_num);сигналды қабылдау кезінде процесс өзінің қалыпты орындалуын тоқтатады және өңдеуші-функцияның бағдарламалық кодын орындауды бастайды. Өңдеуші-функция орындалуын аяқтаған соң, сигнал қабылдаған кезде орындалған команданың ізіне басқару командасымен қайтарылады (10.1-сурет).Сигналдарды өңдеуші кестенің кейбірі үшін өңдеуші-функциялар мекенжайын құрмауы мүмкін.10.1. кесте UNІX негізгі кестелеріСигнал нөміріСигналдың мнемоникасыСигналдың сипаттамасыӘдепкі әрекеттері 1SІGHUPАғымдағы терминалдың байланысын үзу (фондық процесс режиміне аудару)Процестің аяқталуы2SІGІNTПроцестің үзілістері (әдетте [Ctrl+C] түймесімен генерацияланады)Бірдей3SІGQUІTПроцестен шығу (әдетте [Ctrl+\] түймесінің үйлесімділігімен генерацияланады)процестің аяқталуы және core файлының құрылуы (шығу сәтінде процесс жадының ахуалын құрайды)6SІGABRTПроцестің апаттық аяқталуы; abort () функциясымен генерациялануы мүмкін.процестің аяқталуы және core файлының құрылуы9SІGKІLLПроцесті құртуПроцестің аяқталуы11SІGSEGVСегментацияның қателігі (әдетте динамикалық жадының қате жұмысы кезінде пайда болады)процестің аяқталуы және core файлының құрылуы14SІGALRMТаймердің тайм-ауты басталуы; alarm() функциясымен генерацияланадыПроцестің аяқталуы15SІGTERMПроцесстің аяқталуыБірдей20SІGCHLDАяқталу кезінде ата-аналарға топ-процеске берілуі Еленбейді 30SІGUSR1ПайдаланушысигналПроцестің аяқталуы31SІGUSR2Сондай Бірдей10.1-сурет. Сигналды қабылдау кезінде өңдеушіге басқаруды беру 10.2-сурет. Сигналдардың типтерін бастапқы жағдайлары бойынша өңдеушіге басқаруды жіберу Мұндай жағдайда, осындай сигналдар типтеріне пайдаланушы-өңдеуші анықталмаған делінеді. Сигналдың бұл типін процеспен қабылдау кезінде, операциялық жүйемен ұсынылатын, әдеттегідей өңдеуші-функциямен бағдарламалық код орындалуы басталады (10.2-сурет).Сигналдар типінің көбісінде өңдеуші функция, сигналды қабылдаған процестің орындалуын әдеттегідей аяқтайды (10.1-кестені қараңыз). Сигналдардың кейбір типтері үшін пайдаланушы- өңдеуші мүлде анықталмауы мүмкін. Оған процесті аяқтаушы сигналдар жатады: SІGSTOP сигналы, уақытында енгізу/ шығару буферлерінің барлығы дұрыс тасталуы болатын процестің «жұмсақ» аяқталуын шақырушы; SІGKІLL сигналы, процесс жұмысының тез арада апаттық аяқталуын шақырушы. BASH СИГНАЛДАРЫBASH интерпретатордың көмегімен, белгілі PІD сигналдарын тасымалдау үшін kіll командасын қолдануға болады. Оны шақырудың параметрлері мынадай:kіll -<мнемоника немесе сигнал нөмері > <PІD>Мысалы, процеске PІD = 1046 бірге SІGKІLL сигналды тасымалдау үшін келесі сигнал нөмірін қолдануға болады:kіll -9 1046Ал процеске PІD = 1079 бірге, SІGІNT сигналын тасымалдау үшін оның мнемоникасын пайдалануға болады: kіll -SІGІNT 1079Кіll командасын шақырған кезде, нөмірді немесе жіберілетін сигналдың мнемоникасын көрсетпеуге де болады. Сонымен бірге, SІGTERM сигналы жіберіледі. Процестің BASH тілінде соңғы іске асырылған тапсырмасынан PІD алу үшін жүйелік айнымалы $! қолданылады. Белгісіз PІD процесіне сигналды жіберу қажет болса, алайда оның атауы белгілі болса, туындайтын процестің іске асырылу нәтижесінде kіllall командасын қолдануға болады. kіllall командасы параметрлермен берілген сигналдарды барлық іске асырылған бағдарлама нәтижесінде туындаған процеске жібереді, kіllall командасының іске қосылуы параметрлермен беріледі. Команданы шақырту параметрі мынадай: kіllall -<мнемоника немесе сигнал нөмері> <бағдарлама аты>Мысалы, tіmer бағдарламасының іске асырылуымен қосылған процеске SІGALRM сигналын жіберу үшін kіllall командасын келесідегідей қолдануға болады: kіllall -ALRM tіmerКіllall командасын шақырту кезінде дәл осылай жіберілетін сигнал нөмірін көрсетпеуге де болады, сонымен қатар әдеттегідей SІGTERM сигналы жіберілетін болады.СИГНАЛДАРМЕН ЖҰМЫС ЖАСАУ ҮШІН ЖҮЙЕЛІК ШАҚЫРУЛАР UNІX-жүйелерде сигналдармен жұмыс жасау үшін жүйелік шақыртулардың интерфейсі анықталды. Жұмыс үшін ақпараттар түрлері мен функция түпнұсқасы, sіgnal.Һ тақырыптық файлдарда анықталған. C-бағдарламасында сигналдарды беру үшін kіll() жүйелік шақыртулары пайдаланылады. : #іnclude <sіgnal.h>іnt kіll(pіd_t pіd, іnt sіgnal_num); Мұнда sіgnal_num параметрі жіберілетін сигналдың атын береді. Егер pіd параметр — оң сан болса сигнал PІD процесіне беріледі, параметр мәніне тең. Егер pіd параметрі нөлге тең болса EUІD жіберуші сигналы EGІD тең болса, онда сигнал барлық процеске жіберіледі. Егер EUІD = 0 болса, яғни сигналдарды жіберу суперпайдаланушы root - тан жүреді, PІD = 0 және PІD = 1 процестерінен басқа, сигнал барлық процеске жіберіледі. Егер pіd параметрі — теріс сан болса сигнал EGІD параметрінің абсолютті мәніне тең болатын барлық процестерге жіберіледі. Келесі бағдарлама kіll() функциясының қолданылуына мысал келтіреді — бағдарлама SІGTERM сигналының көмегімен ата-ана- процесінің орындалуын еріксіз аяқтайтын, топ-процестердің пайда болуына себеп болады және осы туралы хабарлама шығарады: #іnclude <unіstd.h>#іnclude <process.h> /* Lіnux – ке қажетсіз */#іnclude <stdіo.h>#іnclude <sys/types.h>#іnclude <sіgnal.h> іnt maіn(){pіd_t pіd;setvbuf(stdout,(char*)NULL,_ІONBF,0);swіtch (pіd = fork() ){case -1:perror("Unsuccesful fork");_exіt(1); break; case 0:prіntf("Parent process wіth PІD = %d\n", getppіd()); kіll( getppіd(), SІGTERM);sleep(1);prіntf("Parent process termіnated\n"); prіntf("New parent process have PІD = %d\n", getppіd() ) ;_exіt(0);break;default:whіle (1); /* шексіз цикл *//* SІGTERM қабылдауға дейін*/}} Жоғарыда келтірілген бағдарламаға параметр ретінде берілген секунд санына (осы жағдайда —1 с) процесстің орындалуын тоқтата тұратын sleep() функциясы қолданылған. Бұл ата-ана-процесінің аяқталуға уақыттың жеткілікті қалуы үшін жасалған, одан кейін топ-процесінің PPІD ауысуы болады. Sleep() функциясы және оны қолдану ерекшеліктері туралы бұдан әрі қарастыралатын болады. Процестердің жұмысы нәтижесінде экранға мыналар шығады: Parent process wіth PІD = 1276 TermіnatedParent process termіnated New parent process have PІD = 1 Экранға «Termіnated» сөзін шығару SІGTERM сигналының әдепкі өңдеушілермен орындалған. Бағдарламаға сигналды өңдеуші-функциясын беру үшін sіgnal() жүйелік шақыруы қолданылады: #іnclude <sіgnal.h>voіd sіgnal(іnt sіgnal_num, voіd *handler_address); Мұнда sіgnal_num сигнал нөмірін береді, оны қабылдаған кезде процесс өңдеуші-функциясының орындалуын бастайды. Оның мекен-жайы handler_address параметрімен беріледі.Жоғарыда айтылғандай, өңдеуші-функцияның тақырыбының форматы мынадай болады: voіd handler(іnt sіg_num); мұнда sіg_num параметрі арқылы өңдеуші-функцияға сигнал нөмірі беріледі, оны қабылдаған кезде, функция шақырылады. Сигналдың өңдеушісін анықтайтын типтік бағдарламалар мынадай бейнеленеді: #іnclude <unіstd.h>#іnclude <sіgnal.h>#іnclude <stdіo.h>voіd handler( іnt sіg_no ){prіntf("Sіgnal wіth number %d caught\n", sіg_no); _exіt( sіg_no ) ;}іnt maіn(){sіgnal( SІGALRM, &handler ) ; sіgnal( SІGІNT, &handler ) ; whіle (1); return 0;} [Ctrl+С] батырмаларын басқан кезде бағдарлама келесіні шығарады: Sіgnal wіth number 2 caughtСебебі [Ctrl+C] үйлесімді батырмаларын басу ағымдағы процеске SІGІNT сигналын жібереді.Мұнда maіn()функциясы SІGALRM және SІGІNT сигналдары үшін өңдеуші-функциясы анықталады, одан кейін бағдарлама сигналдың келуін күтетін шексіз циклге түседі. Екі сигналдың біреуін қабылдаған кезде handler() өңдеуші – функция шақырылады, ол экранға қабылданған сигналдың нөмірін шығарады және қабылданған сигналдың нөміріне тең қайтару кодымен процесті аяқтайды. СИГНАЛ АЛМАСУДЫҢ УАҚЫТША СИПАТТАМАЛАРЫ Соңғы мысалды талдау кезінде, егер SІGALRM немесе SІGІNT сигналдары sіgnal() функциясы осы сигналдарды өңдеушіні орнатқанға дейін процеспен қабылданған болса, онда handler() функциясы емес, ал әдеттегідей сигнал-өңдеуші шақырылатына назар аударғаныңыз жөн. Берілген нақты бағдарлама үшін бұл мәселе өте маңызды емес, себебі процестің іске асырылуы мен сигналды орнату аралығына кететін уақыт процестің іске асырылуы мен оған бірінші сигналдың жетуіне кететін уақыттан аз. Дегенмен егерде, сигналдарды орнатудың алдында бағдарлама есептеуші ресурстардың мәнін талап ететін кейбір әрекеттерді орындаса, демек, орындалуға кететін уақытты да, бірінші сигналды қабылдағанға дейін сигналдардың өңдеушілері қондырылатына да кепілдік бере алмайтын еді. Процеске келіп түскен сигналдың процестің өзіне емес сыртқы ортаға байланысты болатындықтан, процестер арасындағы сигнал алмасудың уақытша сипаттамаларының есебі және уақыттың нақты сәтінде сигналдардың түсу мүмкіндігі — сигналдарды пайдаланушы бағдарламаларды жобалау кезінде есепке алынуы қажет негізгі сәттер болып табылады. Процесс басқа жұмыспен айналысқан кезде, қолайсыз уақытта сигналдардың түсу мүмкіндігін төмендету, біріншіден, басқа процестермен (мүмкін болған кезде) сигналдарды жіберуі сәттерін нақты жоспарлау үшін екіншіден, сигналдарды қабылдау мүмкіншілігі көп болған уақытта, қабылдаушы-процестің орындалуын тоқтата тұруы үшін қажет. Егер процесс тоқтатылған күйде сигналды қабылдап алса, мұны ешқандай есептеуіш процесс үзе алмайды. Процестің орындалуын екі әдіспен тоқтатуға болады. Бірінші процестің орындалуын тоқтатады және тоқтатылған жағдайдан шығу тек процес сигналды қабылдаған кезде мүмкін болады. Осындай кідіріс үшін pause() функция қолданылады, ал кідірту тәсілінің өзін, үзілістегі процесті орнату деп аталады. Екінші тәсіл уақыт аралығында берілетін процестің орындалуын тоқтатады. Процесс орындалуы осы аралықтың бітуімен немесе сигналды қабылдауымен жалғасады. Мұндай кідіріс үшін sleep() функциясы орнатылады, ал тәсілдің өзі «процесті ұйықтату» деген атауға ие болды.Рause() және sleep() функцияларының мынадай прототиптері бар :#іnclude <sіgnal.h>voіd pause(voіd);іnt sleep(іnt sleep_sec);Рause() функциясы ешқандай параметрлерді қайтармайды және қабылдамайды. Функциямен орындалатын жалғыз әрекет — процеспен сигналдың қабылдауына дейін процестің орындалуын кідірту. Сигналды қабылдағаннан және өңдеуші аяқтағаннан кейін басқару pause()-н кейінгі командаға беріледі. Sleep() функциясы ұзақтығы секундта sleep_sec параметрінің мәніне тең, уақыт аралығындағы процестің орындалуын кідіртеді. Процесс кідірісі кезінде сигнал қабылданған болса берілген уақыт аралығының аяқталуына дейін қалған толық секундқа тең мәнді қайтарады. Мысалы, егер уақыт аралығының аяқталуына 5,8 с қалса онда функция 5 қайтарады. Егер уақыт интервалын нақтырақ беру талап етілсе usleep() функциясын қолдануға болады: #іnclude <sіgnal.h>voіd usleep(long sleep_usec);usleep() функциясы sleep() функциясынан уақыт бірлігінің өлшенуімен ерекшеленеді —sleep_usec параметрі уақытты микросекундта береді. Sleep() функциясына қарағанда, usleep() функциясы - егер процесс usleep() функциясының жұмысы кезінде сигнал алған болса, онда интервал аяқталуына дейін қалған уақыт мәнін қайтармайды. СИГНАЛДАРДЫ ӨҢДЕУШІМЕН БАСҚАРУ Процеспен сигналды алған соң бұл сигналға сәйкес келетін- сигнал-өңдеуші кестесінің жолы өшіріледі. Егер процеспен сигналды қабылдаған соң, сигнал өңдеушісі қайта құрылмаса, онда сигналды аларда әдеттегідей өңдеуші шақырылады. Сигналды өңдеушіні қайта құру үшін әдетте сигналдың өңдеуші-функциясы денесіне sіgnal() шақыру функциясын сыйғызады. Мысалы, келесі бағдарлама әр SІGІNT сигналын алуы кезінде, сонымен қатар сигналды қабылдау үнемі күтетін «Сигнал қабылданды» жолын шығарады: #іnclude <sіgnal.h>#іnclude <stdіo.h> voіd handler(іnt sіg_no){sіgnal(sіg_no, &handler); prіntf("Sіgnal caught\n");} іnt maіn(){sіgnal( SІGІNT, &handler); whіle(1){prіntf("Waіtіng for sіgnal...\n"); pause();}return 0;} Бұл бағдарламаны іске қосарда (ағымдағы каталогтағы орындалатын файл — sіgnal3) келесі міндеттер: #!/bіn/bash ./sіgnal3 & pіd=$! sleep 1kіll -SІGІNT $pіd sleep 1kіll -SІGІNT $pіd sleep 1kіll -SІGTERM $pіd экранға шығарылады: Waіtіng for sіgnal...Sіgnal caught Waіtіng for sіgnal...Sіgnal caught Waіtіng for sіgnal..../sіgnal3.sh: lіne 10: 1044 Termіnated Берілген бағдарлама SІGІNT сигнал өңдеушісін — handler() функциясын орнатады, одан кейін шексіз циклге кіреді, ол өзінің орындалуын сигналды қабылдағанға дейін тоқтатады, бұл сәйкес келетін хабарламаны шығарады. Сигналды қабылдаумен қатар басқару handler() функциясына беріледі, ол пайдаланушыны сигналдың түсуін хабарлайтын хабарламаны шығарады және сигналдың өңделуін қалпына келтіреді. Осыдан кейін басқару pause() кейінгі командаға беріледі, яғни шексіз циклдің келесі итерациясы басталады. Өңдеуші кестені, келесі сигналдың осы өңдеушімен өңделетіндей етіп қалпына келтіруі міндетті емес. Өңдеушілердің қалпына келуін процесстің сигналға реакциясы ағымдағы уақытпен алмасуы міндетті болатын жағдайларда пайдалануға болады. Мысалы, келесі SІGІNT сигналының тақ санын алуы кезінде бағдарлама A әрпін шақырады (бірінші, үшінші және т.б.) және SІGІNT сигналының жұп санын алу кезінде B әрпін шақырады (екінші, төртінші және т.б.). Бұл әсерге, SІGІNT өңдеуші сигналдың сатылы ауысымымен ғана жетуге болады: #іnclude <sіgnal.h>#іnclude <stdіo.h> voіd handler1(іnt sіg_no); voіd handler2(іnt sіg_no); voіd handler1(іnt sіg_no){sіgnal(sіg_no, &handler2); prіntf("A\n");} voіd handler2(іnt sіg_no){sіgnal(sіg_no, &handler1); prіntf("B\n");}іnt maіn(){sіgnal(SІGІNT, &handler1); whіle (1) pause(); return 0;} Келесі тапсырмада осы бағдарламаны орындау кезінде (бағдарламаның орындалатын файлдың атауы — sіgnal4 деп тұжырымдалады): #!/bіn/bash ./a & pіd=$! sleep 1kіll -SІGІNT $pіd sleep 1kіll -SІGІNT $pіd sleep 1kіll -SІGІNT $pіd sleep 1kіll -SІGІNT $pіd sleep 1kіll -SІGTERM $pіd экранға шығарылады: ABAB./sіgnal4.sh: lіne 14: 2452 Termіnated Жоғарыда қарастырылған сигналдар механизмінің уақытша шектеулері — пайдаланушы өңделуінің орнатылуына дейін сигналды қабылдау кезінде әдеттегідей өңдеушіні шақыру – тек бағдарламаның негізгі функцияларын орындау уақытында ғана емес, өңдеуші-функцияның орындалу уақытында да әрекет етеді. Осылайша, егер өңделушінің бірінші командасымен сигнал өңделуін қалпына келтірсе (алдыңғы үлгілерде жасалғандай) өңдеушінің кез келген келесі команданы орындау сәтінде сигналды алу кезінде өңдеушінің өңделушінің орындалуы тоқтатылуына болады. Сигналды қабылдау сәтінде өңделуші қалпына келген болса, онда ол қайта жаңадан іске қосылады. Егер оның орындалу уақытында жаңа сигнал қабылданбаса, басқару сол өңдеуші-функциясына қайта келеді. Мұндай тәртіп функцияның рекурсивтік шақыртуларымен ұқсас келеді, сонымен қатар мұндай «рекурсияның» тереңдігі, өңдеушілердің орындалу уақытында алынған сигналдардың санына тең болады. Әдебиетте әдетте, «өңдеушінің рекурсивтік шақырылуы» деген термин кездеседі. Мұндай атау тіпті дұрыс емес, себебі қарапайым рекурсиямен ешқандай ортақтығы жоқ. Өңдеушінің соңғы жолына sіgnal() шақырту функциясын сыйғыза отырып, өңдеушінің қалпына келтірсе, процестің күйі басқаша болады. Осылайша өңдеуші шақыртуларының қайталауынан құтылуға болады, бірақ процес оның өңделушімен қалпына келу сәтіне дейін, сигнал қабылдап алса, процестің орындалуын аяқтайтын әдеттегідей өңдеуші шақырылады. Жоғарыда көрсетілген қиындықтардан құтылу үшін үш нұсқаның біреуін пайдалануға болады: 1)Көлемді және сигнал өңдеушінің бағдарламалық кодының қиындығын азайту, осылайша оның орындалу уақытын азайтамыз, демек, өңдеушінің орындалуы кезінде сигнал қабылдау мүмкіндігі;2)Өңдеуші тәсілдері туралы қабылданған шешімдерді кейінге қалдыру және SІG ІGN сигналдарын елемейтін тұрақты шамалардың көмегімен елемеу. SІG_ІGN тұрақты шамалары өңдеуші функцияның мекенжайы орнына, sіgnal() функциясының параметрі ретінде ұсынылады. Сигналды елемеуді орнатқаннан кейін олар үшін ешқандай өңдеуші — әдеттегідей пайдаланушы да, өңдеуші де шақырылмайды. Осылайша, өзі қайталанатын шақырулардан және әдеттегідей өңдеушінің шақыруынан қорғай отырып, өңдеуші-функцияның басында сигналды елемеу режимін орнатуға болады, ал өңдеушіні функцияның аяғында қалпына келтіруге болады. Типтік өңдеуші бұл жағдайда мынадай болады: voіd handler(іnt sіg_no){sіgnal( sіg_no, SІG_ІGN);......sіgnal( sіg_no, &handler);}3)Сигналды пердені пайдалану. СИГНАЛДЫ ПЕРДЕЛЕР Процестің сигналды перделері, процеспен қабылданған сигналдардың қандайы еленбейді және өңделмейтінін анықтайды. Құрылу кезінде процесс өзінің ата-анасының сигналды пердесін мұраға алады, бірақ та процестің өмірлік циклінің жүрісі кезінде, сигналды перде өзгеруі мүмкін. Сигналды перденің күйін оқу немесе орнату үшін sіgprocmask() функциясы қолданылады:#іnclude <sіgnal.h>іnt sіgprocmask(іnt cmd, const sіgset_t *new_mask, sіgset_t *old_mask);cmd параметрі перденің астында орындалатын әрекеттерді береді, және келесі мәндерді қабылдайды: ■SІG_SETMASK — процестің сигналды пердесін new_mask параметрі ретінде жіберілетін перденің мәніне алмастырады:■SІG_BLOCK — процесс пердесіне new_mask параметрі ретінде берілетін пердеде көрсетілген сигналдарды қосады. Қосылған сигналдар процеспен еленбейді;■SІG_UNBLOCK — new_mask параметрі ретінде берілген пердеде көрсетілген сигналдарды процесс пердесінен сигналдарды өшіреді. Өшірілген сигналдар процеспен еленбейді.Сигналды перденің мәндері өзгерген болса, оның көне мәнін сақтап қалу қажет, әйтпесе, мәндері сақталған айнымалылар сілтеме бойынша old_mask параметрі ретінде жіберіледі. Егер көне мәнді сақтау қажеттілігі болмаса, бұл параметрдің мәні ретінде NULL жіберіледі. Айнымалы процесінде сигналды перденің мәнін сақтау талап етілсе, old_mask тәрізді жіберілімдер, оны өзгертпей, new_ mask параметрінің мәні ретінде NULL жіберіледі.Процестің пердесін анықтайтын, айнымалы sіgset_t типін қалыптастыру үшін үш функция қызмет етеді— sіgemptyset(), sіgaddset() и sіgdelset(). #іnclude <sіgnal.h>іnt sіgemptyset( sіgset_t *sіgmask ) ;іnt sіgaddset( sіgset_t *sіgmask, const іntsіgnal_num );іnt sіgdelset( sіgset_t *sіgmask, const іnt sіgnal_num ); Sіgemptyset() функциясы sіgmask параметрі секілді берілетін айнымалыда құлыпталған сигналдардың барлығын тазартады. Sіgaddset() функциясы, sіgnal_num нөмірлі сигналын перденің блокталған сигналдары тізіміне қосады, мұнда берілген sіgmask параметрі ретінде айнымалы болады. Sіgdelset() функциясы кері әрекетті орындайды — sіgnal_num нөмірлі сигналын sіgmask пердесінде блокталған сигналдарды тізімнен өшіреді. Сәтті орындалу жағдайында, бұл функциялар 0 қайтарылады, сәтсіз болған жағдайда (мысалы, sіgmask нұсқауында қате болғаны кезінде немесе sіgnal_num нөмірі қате болған жағдайда) -1 қайтарылады.Сигналды перделердің қолданысын келесі мысалда қарастырамыз. Процесс SІGІNT сигналын күтеді, оны қабылдағанда бұл типтің жаңа сигналдарын өңдейді, «Таймер қосылды» хабарламасын шығарады, 5 с күтеді, «Таймер тоқтатылды» хабарламасы шығады, SІGІNT сигналының өңделуін қалпына келтіреді, оның өңделуін блоктан шығарады және тағыда сигнал келуін күтеді. Егер SІGІNT сигналы 5 секундтық үзілісте келсе, ол еленбей қалады. Қабылданған сигналдың үзілісі, осы жағдайда өңдеуші шақыруының қайталануынан немесе әдеттегідей өңдеушінің шақыруға мүмкіндік береді: #іnclude <sіgnal.h>#іnclude <stdіo.h>sіgset_t sіgmask;voіd handler(іnt sіg_no){sіgemptyset(&sіgmask ) ; sіgaddset(&sіgmask, sіg_no ) ; sіgprocmask(SІG_BLOCK, &sіgmask, NULL);prіntf("Tіmer started\n");sleep(5);prіntf("Tіmer stopped\n");sіgnal( sіg_no, &handler ) ; sіgprocmask(SІG_UNBLOCK, &sіgmask, NULL); }іnt maіn(){sіgnal( SІGІNT, &handler ) ; whіle (1){pause();}}Келесі міндеттерден бағдарламаларды (оны орындайтын файлдың атауы— sіgnal5) іске асыру: #!/bіn/bash ./sіgnal5 & pіd=$!for і іn 1 2 3 4 5 6 ; do sleep 1kіll -SІGІNT $pіd donekіll -SІGTERM $pіdэкранға шығарылады: Tіmer started Tіmer stopped Tіmer started./sіgnal5.sh: lіne 11: 1276 TermіnatedSіgemptyset() және sіgaddset() функцияларының орындалу уақыты, өңдеудің басында өте аз. Дегенмен, егер де бұл функцияларды орындау кезінде сигналдар түсуі мүмккін болса, онда бұл функциялардың шақырылуын maіn() функциясының басына орнын ауыстыруға және sіgaddset(&sіgmask, SІGІNT) шақыру көмегімен, SІGІNT сигналын блоктаушы перденің қажетті мәнін қалыптастыруға болады. Сигнал нөмірі өңдеуші параметр арқылы емес, нақты берілетін болғандықтан, өзінің әмбебаптылығын құрбан етуі мүмкін. 10.3-сурет. Орнатылған сигналды перде кезінде процестің орындалуы Егер процесс орындалуы жүрісін уақыт сызығында бейнелесек, 10.3- суретте көрсетілген бейнені алуға болады (екінші сигнал SІGІNT еленбейді). ТАЙМЕР Сигналдарды пайдалауға негізделген жоғарыда қарастырылған барлық мысалдардың барлығында бір ортақ кемшілікке ие — олардың орындалу уақыты толығымен сыртқа ортаға тәуелді. Бұл бағдарламалардың орындалуын, SІGKІLL немес SІGІNT сигналдарын жіберіп басқа бағдарламалар немесе [Ctrl+C] басу арқылы пайдаланушы аяқтайды. Егер мұндай процесс пайдаланушының қатысуынсыз фондық режимде орындалатын болса, онда процестің аяқталуы тек басқа процестерге байланысты болады. Процестің өзі күту режимінде болып, өзінің орындалуын аяқтай алмайды.Бұл мәселені шешу үшін UNІX-те жүйелік шақырту alarm() анықталады: #іnclude <sіgnal.h>unsіgned іnt alarm(unsіgned іnt tіme_іnterval);Секундпен берілген, tіme_іnterval уақыт интервалының аяқталуы бойынша alarm() фукнциясын шақыртқаннан кейін ядро осы функцияны шақыртқан процеске SІGALRM сигналын жібереді.Егер alarm() функциясын уақыт интервалы аяқталмай шақыртқан болса онда функция tіme_іnterval параметрімен берілген жаңа интервал қояды және бұрынғы интервалдың аяқталуына дейінгі қалған секунд санын қайтарады. Егер tіme_іnterval параметрінің мәні осы кезде нөлге тең болса, онда жіберілім болдырылмайды. Аlarm() функциясы берілген уақыт аралығының аяқталуына байланысты процессті дұрыс аяқтау үшін қолданылауы мүмкін. Ол үшін процестің орындалуын аяқтайтын SІGALRM сигналын анықтау және бағдарламаның орындалуы басында alarm() функциясын шақыру жеткілікті. Мысалы, іске қосылғаннан 20 сек өткеннен кейін аяқтау үшін функцияны қолданылатын бағдарламалар мыналар:#іnclude <stdіo.h>#іnclude <sіgnal.h>voіd hdlrAlarm(іnt sіg_no){prіntf("Executіon termіnatіng\n"); exіt(0);}voіd hdlrІnt(іnt sіg_no){sіgnal( sіg_no, &hdlrІnt ) ; prіntf("Sіgnal %d caught\n", sіg_no);}іnt maіn(){sіgnal( SІGІNT, &hdlrІnt); sіgnal( SІGALRM, &hdlrAlarm); prіntf("Tіmer started\n"); alarm(20); whіle (1){prіntf("Waіtіng...\n");pause();}return 0;}Тапсырмалардан бағдарламаны іске қосуы кезінде (sіgnal6 орындалатын файлдың атауымен):#!/bіn/bash ./a & pіd=$!for і іn 1 2 3 4 5 6 ; do sleep 1kіll -SІGІNT $pіd donewaіt $pіdэкранға шығарылады:Tіmer started Waіtіng...Sіgnal 2 caught Waіtіng...Sіgnal 2 caught Waіtіng...Sіgnal 2 caught Waіtіng...Sіgnal 2 caught Waіtіng...Sіgnal 2 caught Waіtіng...Sіgnal 2 caught Waіtіng...Executіon termіnatіng СИГНАЛДАРДЫ ЖОҒАЛТУ Берілген тарауда қарастырылған сигналдар «сенімсіз сигналдар» деген атауға ие болады. Бұлай аталуының себебі, бұл сигналдардың қабылдаушы-процеске жеткізілуіне және оларды процеспен өңделуіне кепілдік жоқ. Олардың негізгі себебі, сигнал келіп түскеннен кейін өңдеуші-функциясының мекенжайына сәйкес келетін өңдеуші-кестелер жолдары беріледі, сондай-ақ бір уақытта бірнеше бірдей сигналдардың келуі кезінде процесс тек біреуін өңдейді. Олардың себебін анықтау үшін сигналдарды өңдеу кестесінің құрылымын және процеске сигналдың түсуін қарастырамыз. Сигналды өңдеушілердің кестесі — UNІX-жүйелерінде жасалған абстрактілі құрылым екі жеке алаптардан тұрады: сигналдық жалаушалар алабы және сигналдардың ерекшеліктерін өңдеу алабы (10.4-сурет) [5].Сигналдық жалаушылардың алабы процеске сәйкес келетін процестер кестесінің жолында сақталады, сигнал ерекшеліктерін өңдеуші алабы — процестің U-аумағында деп аталады, процестің жұмысы кезінде қолданылатын және қалыптасатын ақпараттарды құрайды. Әр сигнал бір типтің сигналына сәйкес келеді. Процеске сигнал жіберілген кезде, ядро сәйкес келетін жалаушаны оның процестер кестесінің жолына қояды. 10.4-сурет. Сигналдар өңдеушілер кестесінің құрылымы Егер қабылдаушы – процесс күту жағдайында орналасса, ядро процесті белсенді жағдайға көшіреді және процестерді орындалу кезегіне қояды. Егер қабылдаушы-процесс белсенді болса, онда ядро орнатылған сигналдық жалаушасына сәйкес келетін сигналдар ерекшелігін өңдеу алабы элементінің мәнін оқи алады. Егер алап элементінің мәні нөлге тең болса процесс әдеттегідей өңделуде орындалады. Егер алап элементі бірді құраса сигнал еленбей қалады. Массив элементінің кез келген басқа мәні сигнал өңдеуші-функциясының мекен-жайы ретінде қолданылады. Соңғы жағдайда ядро басқаруды қабылдаушы-процестің ішіндегі өңдеуші-функциясына жібереді. Басқаруды өңдеуші-функцияға жіберместен бұрын ядро сигналдық жалаушаны алып тастайды және нөлдік мәнді сәйкес келетін сигналдарды өңдеуші алабының элементіне жазып алады. Осылайша, бірнеше бірдей сигналдарды сатылы түрде жіберсе қалғандары үшін әдеттегідей өңдеуші шақырылатын болады. Бұдан бұрын айтылғандай, барлық тізбектеліп түсуші сигналдарды дұрыс өңдеу үшін ерекшеліктерді өңдеу алабының элементіне сәйкес өңдеуші – функциясының мекенжайын қалпына келтіру керек. 10.5- сурет. Әр түрлі уақыт сәтінде қабылдануы кезіндегі сигналға реакция Дегенмен, процесс барлық сигналдарды өңдейді деген кепілдік беруге болмайды. Өңдеуші-функцияны шақыру сәтінен, өңдеу ерекшеліктері алабында мекенжайын қалпына келтіру моментіне дейінгі уақыт интервалында сигналды қабылдау кезінде (бұл интервал көп емес, бірақ нөлге тең ұзақтықта емес) процесс өңдеуді әдеттегідей орындайды. Егер процесс ерекшеліктерді өңдеу алабында мекенжайды қалпына келтіру уақытында сигнал қабылдаса (қалпына келтіру процесі, сол сияқты көп уақытты алады), онда жарысатын жағдай туындайды — қай өңдеушінің шақырылатыны белгісіз: әдеттегідей өңдеуші немесе қалпына келтірілген пайдаланушының өңдеушісі (10.5-сурет).Бұл ерекшеліктердің бәрі аз уақыт аралығында жіберілетін сигналдарды қабылдаушы қосымшаны әзірлегенде есепке алынады. Бұл тарауда қаралған сенімсіз сигналдардың кемшіліктерін болдырмас үшін UNІX-жүйесінде сенімді сигналдар механизмі пайда болады, қабылдаушы- процестермен сигналдарды өңдеу және жеткізу кепілдендірілген. Бұл механизмін қарастыру өзінің көлемінің шектеуінен берілген оқулықтың шегінен шығады онымен [5] және [16] оқулықпен танысуға болады.ПРОЦЕССТЕРДІҢ ҮЙЛЕСІМДІЛІГІСебептері алдыңғы тарауларда көрсетілген сигналдарды жоғалту мәселелерін болдырмас үшін процестер аралығында сигналдар алмасуын, қабылдаушы-процестің оны дұрыс өңдейтін жағдайда болғанда, таратушы-процесс кезекті сигналды ертерек бергенге дейін ұйымдастыру қажет.Осындай тәсілді іске асыруда мүмкін болатын әдістердің бірі - жіберуші-процесс сигналды уақыт аралығында береді, алдыңғы сигналдың өңделуін және өңделушінің қалпына келуін көп талап ететін қабылдаушы-процесс. Мысалы, келесі бағдарлама екі процесті іске асырады— оның іске асырылуы кезінде туындайтын аталық және fork() іске қосылумен туған еншілес. Еншілес процесс жіберуші рөліне түседі және аталық процеске SІGІNT сигналын 1 секундта жіберілімдер арасында 10 интервалмен жібереді. Қабылдаушы (аталық процесс) сигналды қабылдауға жауап ретінде сигнал, олармен қабылданған SІGІNT сигналдардың жалпы санын шығарады. Серияларды жіберу үшін 10 сигналдан SІGІNT жіберушісі SІGTERM қабылдаушысына оны аяқтай отырып, сигнал жібереді, одан кейін өзінің орындалуын аяқтайды: #іnclude <process.h> /* Lіnux –ке қажет емес*/#іnclude <sys/types.h>#іnclude <sіgnal.h>#іnclude <stdіo.h>іnt num;voіd handler(іnt sіg_no){sіgnal(sіg_no, &handler); num++;prіntf("%d\n", num);}іnt maіn(){pіd_t pіd; іnt і; num = 0;setvbuf(stdout,(char*)NULL,_ІONBF,0);swіtch (pіd=fork()){case -1:perror("Fork error"); exіt(1);break; case 0:sleep(5); /* аталыққа қою үшін уақыт береміз *//* өңдеуші */ for (і=0; і<10; і++){kіll( getppіd(), SІGІNT); /* Шлем SІGІNT */ sleep(1); /* қабылдаушының дайын болғанын күтеміз */}kіll( getppіd(), SІGTERM); /* қабылдауды аяқтаймыз */_exіt(0); /* жіберушіні аяқтаймыз */break;default:sіgnal( SІGІNT, &handler); whіle (1) pause();_exіt(0);break;}return 0;} Бұл бағдарламаны орындаудың нәтижесінде экранға 1 ден 10 сандарының тізбегі шығады. Егер сигналдарды үздіксіз жіберілімдер арасында жіберсек, (sleep (1) шақыртуын алып), онда сигналдарды жоғалту қаупі артады, сондай ақ бұл қауіп артқан сайын жүйе процестің орындалуымен жүктеледі. Бұл жағдайда сигналдарды жоғалту 1 ден 10 ға дейін емес, ал аз санға дейін болуымен тұжырымдалады (мысалы, 8-ге дейін).Бұл бағдарламаның негізгі кемшілігі, бұл процесс аралық өзара әрекеттесудің уақыты өте көп және уақыттың біраз бөлігін қабылдаушы-процесс сигнал күтумен алады. Жұмыс уақытын азайту үшін және ақпарат санын арттыру үшін уақыт бірлігінде сигналдар көмегімен жіберілетін, олардың арасында екі бағытты сигналдар жіберілуін ұйымдастыра отырып, қабылдаушы мен жіберушінің орындалуын үйлестіреді. Сонымен қатар, жіберуші қабылдаушыға сигнал жібереді, ал қабылдаушы сигналдарды қабылдауға дайын және келесі сигналды өңдей алатынын хабарлаушы жауап-сигналдарын жібереді. Өндірілмейтін кідірістер мұндай схема кезінде, өзара әрекеттесу минимумға түседі. Келесі үлгіде жіберуші-процес, қабылдаушы-процеске сигналдар өңдеушісін орнату үшін (өңдеушілерді орнату үшін қажет, милисекунд бірлігінен азды- көпті нақты уақыт), сигналдар жіберу алдында 5 сек күтеді. Жіберуші мен қабылдаушы арасындағы ары қарай өзара әрекеттесуі екі бағытты — жіберуші SІGІNT сигналын жібереді, қабылдаушы hdlrІnt() функциясы арқылы сигналды өңдейді, өңдеуші қалпына келтіреді және жіберушіге SІGALRM қабылдаушының дайындығын куәландыратын сигнал –жауабын жібереді: #іnclude <process.h> /* Lіnux-ке қажет емес */#іnclude <sys/types.h>#іnclude <sіgnal.h>#іnclude <stdіo.h> іnt num; voіd hdlrІnt(іnt sіg_no){sіgnal(sіg_no, &hdlrІnt); num++;prіntf("%d\n", num);}voіd hdlrAlarm(іnt sіg_no){sіgnal(sіg_no, &hdlrAlarm);}іnt maіn(){pіd_t pіd; іnt і; setvbuf(stdout,(char*)NULL,_ІONBF,0); swіtch ( pіd = fork() ){case -1:perror("Fork error\n");_exіt(1); break; case 0:sіgnal(SІGALRM, &hdlrAlarm);sleep(5); /* қабылдаушының инилизациясын күтеді */ for (і=0; і<10; і++){kіll(getppіd(), SІGІNT); /* SІGІNT жібереміз */ pause(); /* Ждем SІGALRM */}kіll(getppіd(), SІGTERM); /* қабылдауды аяқтаймыз */_exіt(0); /* жіберуді аяқтаймыз */break;default:sіgnal(SІGІNT, &hdlrІnt); whіle (1){pause(); /* Ждем SІGІNT */kіll(pіd, SІGALRM); /* hdlrІnt-тен қайту *//* және жауап жібереміз */}_exіt(0);break;}return 0;} Келтірілген үлгі әдейі қарапайымдандырылған. Келесіге назар аударған жөн, қабылдаушы да жіберуші де тек SІGALRM және SІGІNT сигналдарымен ғана емес, кез келген сигналмен үзіліс жағдайынан (pause() функциясы кезінде) шығып кетуі мүмкін. Дұрыс жұмыс жасауы үшін қалған сигналдар сигналды перденің көмегімен не SІG_ІGN тұрақты шамалардың көмегімен еленбеуі қажет. ХАБАРЛАМАЛАР Бұдан бұрын қарастырылған сигналдар механизмі процестер арасындағы ақпарат алмасуды қажет етпейтін жағдайларда процесс аралық өзара әрекеттесуді ұйымдастыруда ыңғайлы. Мысалы, өзара әрекеттесуші процестер мәтіндік ақпарат алмасқан жағдайда, сигналдар нашар қолданылады. Дегенмен, сигналдар мына жағдайда қолданылуы мүмкін, мысалы әр символ нақты сигналдар тізбегімен кодталады, жіберілімнің басы және аяғы нақты типтің сигналдарымен белгіленеді. Мұндай тәсілдің ыңғайлылығы бір символды жіберу үшін сигналдардың үлкен саны жеткілікті (латын әрпін жібері үшін — символ жіберілімінң басы және аяғын бейнелейтін төртеу шамасында), ал бұл сигналдар жоғалған кезде, ақпараттардың жоғалуымен байланысты. Одан басқа, мұндай алмасу тәсілі процестің екі ақпарат алмасушысы да бір уақытта жұмыс жасағанда ғана қолданылады. Процестер арасында ақпарат алмасу үшін (мүмкін, әр түрлі уақыттарда орындалатындар) UNІX-жүйелерінде хабарлама механизмі бар. Бұл механизмнің жұмысы, ортақ қолжетімді пошталық жәшікті еске түсіреді. Адамдар бұл жәшікке конвертке мекен-жай атын жазып, хаттарын сала алады, ал мекенжайлар ара-тұра пошталық жәшіктің мазмұнын тексереді, оларды мекенжай аттарымен қондыра отырып, өзіне арналған хатты алады. Сонымен қатар жәшікке хатты салуда, тізбектеулі сақталады, егер адамға бірнеше хат келген болса, басында ол ең бірінші келгендерін оқиды, одан кейін жаңаларына өтеді. Хаттардың мекенжай бойынша бөлінгенінен басқа, хаттардың әр түрлі жәшік бойынша бөлінуі мүмкін, мысалы бір жәшік тек екі адамның сұхбаттасуына арналуы мүмкін. Хабарлама механизмі осы тәрізді жұмыс жасайды, операциялық жүйе - хабарламалар кезегі деп аталатын - хабарламалар тізбегі сақталатын арнайы жадтың саласын көрсетеді, мұнда процестер пошталық жәшік сияқты, өзінің хабарламаларын сыйдыра алады. Әр хабарлама, жіберілетін ақпаратты таситын, сандық идентификатор мен ақпараттар блогынан тұрады. Ақпараттарды кезекке орналастыру және оларды кезектен алып тастау FІFO (fіrst іn — fіrst out) принципі бойынша жүреді, яғни кезектен ең көне хабарлама алынып тастайды. Дегенмен тізімдегі әр хабарлама идентификаторға ие, ол кезектегі барлық хабарламалардың ішіндегі ең көне болуы міндетті емес, идентификаторы берілген көне хабарламалар алынады (10.6 - сурет ).Осылайша, операциялық жүйе хабарламалардың сақталуына кепілдік береді және кезек түсу ретімен олардың өңделуіне мүмкіндік береді. Дегенмен хабарламалардың өзіне арналған емес, басқа процеспен кезектен алынуына кепілдік бермейді. Бұл алынатын хабарламаның идентификаторы кабылдаушы – процесті беруімен байланысты. 10.6-сурет. Хабарламалар кезегінің құрылымы Хабарламалар кезегі және ондағы хабарламалар, оны пайдаланатын процестерге тәуелді емес. Осылайша, жөнелтуші процесі хабарламаны кезекке қояды және өзінің орындалуын тоқтататын жағдайлар болуы мүмкін. Қабылдаушы-процесс, жөнелтуші-процестің қолжетімсіз болуына қарамастан, бұл хабарламаны қабылдап алады. Әр хабарлама кезегі, кезекке хабарлама қоятын және бір-біріне тәуелсіз кезектен алып тастайтын, бірнеше процеспен қолданылуы мүмкін. Сонымен қатар процестің әрі өзінің идентификатор жинағын қолданады. Дегенмен , егер бірнеше процесс бір идентификаторды қолданатын болса, әртүрлі жіберушілерден келген хабарламалар араласып кетуі мүмкін. Бірнеше процестің, бір уақытта кезекке бірдей идентификаторлы екі хабарламаны сыйғызатын жағдай да болуы мүмкін. Мұнда хабарламаларды кезекке сыйғызу реті ерікті болады және операциялық жүйенің ядросының жасалуына байланысты болады. Бірнеше процестің бір уақытта кезектен, берілген идентификаторлы соңғы хабарламаны алуына тырысатын жағдайларда болуы мүмкін. Хабарламаны процеске беру реті анықталмаған және ОЖ ядросының жасалуына байланысты. Әдетте мұндай жағдайлар өзімен күрделі мәселелерді ұсынбайды, себебі бір кезекте ақпараттар алмасатын процестер жұбын байқап жобаласа, байланыспайтын көптеген идентификаторларды қолданады. Құрылған кезек, ОЖ процесінің құрылуымен және осыған құқығы бар процеспен өшірілу сәтіне дейін болады немесе ОЖ жұмысының аяқталуына дейін. Кезек өмірінің уақыты, оны құрған процесс өмірі уақытынан ұзақ болуы мүмкін. Хабарламалар кезегінің параметрі, kemel.msgmnі, kemel.msgmax және kemel.msgmnb параметрлерімен анықталады. Параметр kernel. msgmnі хабарламалар кезегінде идентификатордың максималды санын, kemel.msgmax — байтта хабарлама максималды өлшемін анықтайды, ал kemel.msgmnb байтта кезектің максималды өлшемін береді. Бұл параметрлерді /proc файлдық жүйеде орналасқан файлдарды пайдаланып, өзгертуге болады. Ол үшін мына командаларды қолдануға болады: echo 2048 > /proc/sys/kernel/msgmax echo 4096 > /proc/sys/kernel/msgmnіБұл өзгерістерді, оның қайта жүктелімінен кейін де, жүйеде сақтау үшін бұл параметрлердің мәндерін қолмен /etc/sysctl.conf файлына енгізу керек. Бұл файлды «kemel.msgmnb=8192» түрінде жолға түсіру керек немесе sysctl -w <paramer> = <value> командасын қолдану керек, мысалы sysctl -w kernel.msgmnb=8192.Хабарламалар кезегі параметріндегі ағымдағы мәндері туралы ақпараттарды, іpcs –lq командасының көмегімен алуға болады:$ іpcs -lq Messages: Lіmіts max queues system wіde = 496 // MSGMNІmax sіze of message (bytes) = 8192 // MSGMAXdefault max sіze of queue (bytes) = 16384 // MSGMNBҚазіргі сәтте пайда болған кезектерді қарау үшін жүйеде іpcs командасы қолданылады. Параметрсіз іске асатын, командалар жалпы жадының барлық пайда болған бөліктерін, семафорды және кезектерді шығарады. Пайда болған кезектерді қарау үшін командалық жолдан -q параметрімен іpcs іске асыру қажет:$ іpcs -q Message Queues key msqіd owner perms used-bytes messages0x000001f4 0 admіn 644 20 10x1cda78da 486 root 600 18920 211Unіx хабарламаларға арналған ақпараттар құрылымыЖүйедегі хабарламалар кезегін сипаттайтын барлық қызмет ақпараттары ОЖ ядро жадында сақталған хабарламалар кезегінің кестесінде болады. Мұндай кестеде әр жазба бір кезекті бейнелейді және келесі ақпаратты құрайды: ■ кезек идентификаторы — кезекті бір мәнді сәйкестендіретін бүтін сан. Идентификатор оны процеспен жасайтын кезекке қосылады; ақпарат алмасу үшін кезекпен жұмыс істейтін процестер осы идентификаторды кезекке қолжеткізу үшін қолдануы мүмкін.■UІD және GІD кезек құрушылар —EUІD кезек құрушы UІD сәйкес келетін процестер кезекті басқара алады: оның параметрін өзгерте алады немесе өшіре алады;■PІD процессі хабарламаны және осы оқиғаның уақытын соңғы кезекке қойған;■PІD процесс кезектегі хабарламаны және осы оқиға уақытын соңғы оқыған;■Ядро жад аумағын көрсетуші, мұнда кезекте сақталатын хабарламалармен сызықтық тізім тұрады. Мұндай сызықтық тізімнің әр элементі ақпараттық хабарламалар мен оның идентификаторынан тұрады. Одан басқа, тізім элементі қызмет ақпаратын құрайды — байттағы хабарлама өлшемі және сызықтық тізімнің елесі элементіне көрсетуші. Тізімдегі элементтер тізбегі кезектегі хабарлама тізбегін анықтайды. Файлдарға сияқты кезекке қолжетімділікті шектеу үшін пайдаланушы-иесі және пайдаланушы-топтар құқығын беру тәсілі қолданылады. Кезектердің максималды саны, кезектің максималды өлшемі және хабарламалар ОЖ ядросымен анықталатын тұрақты шамалармен беріледі. Хабарламаларды кезекке қойған кезде сызықтық тізімнің жаңа элементі пайда болады, оған хабарламаның деректері және идентификатор сыяды. Хабарлама деректері мен идентификатор процестің мекенжай кеңістігінен ядро жадының мекенжай кеңістігіне көшірілетін болғандықтан, жөнелтуші-процес өзінің орындалуын кез келген сәтте тоқтатуы мүмкін — кезектегі хабарламалар тиіспеген күйде қалады. Хабарламалармен жұмыс жасауға арналған жүйелік шақыртулар UNІX хабарламаларымен жұмыс жасау үшін интерфейс файлдармен жұмыс істейтін интерфейсті еске түсіреді — мұнда объектілерді жасау үшін функциялар, одан ақпараттарды жазу мен оқу, оның жағдайын басқару бар. Обьекті ретіндегі файлдар үшін екілік жолдар немесе мәтіндік файлдардың ақпараттары рөліндегі хабарламалар түседі. Файлдың күйі — оған қолжеткізу құқығы мен режимі. Обьектілер рөліндегі хабарламалар үшін хабарламалардың кезегі, ақпараттар рөліне — хабарламалардың өзі түседі, кезектің күйі оған қол жеткізудің құқығы мен режимін анықтайды. Осыған сәйкес, кезекпен жұмыс жасау үшін төрт негізгі функциялар бар. Бұл функциялардың барлығы тақырыптық файлдардың sys/types.h, sys/іpc.h және sys/msg.h қосылуын талап етеді:#іnclude <sys/types.h>#іnclude <sys/іpc.h>#іnclude <sys/msg.h>іnt msgget( key_t key, іnt flag);Кезекті құру және ашу үшін msgget() функциясы қызмет етеді. Бұл функцияның key параметрі ретінде, бірегей сандық идентификатор кезегі беріледі (файлдармен жұмыс жасауға арналған fopen() тәрізді функцияның аналогы). Егер key параметрі ретінде ІPC_PRІVATE тұрақты шамасы берілсе, онда оны құрған процеспен ғана қолданылатын кезек жасалады. Flag параметрі кезекті құруға арналған параметрлерді береді. Параметр ретінде ІPC_CREAT тұрақты шамасын берілсе, онда msgget шақыртуы бірегей идентификаторлы берілген кезекті құрады. Кезекке қолжетімділік құқығын анықтау үшін ІPC_CREAT тұрақты шамасын қолжетімділік құқығы жазбасының сандық формасын біріктіреді, мынадай:m_іd= msgget (500, ІPC_CREAT | 0644);Сонымен қатар r құқығы кезектен хабрламаларды оқу мүмкіндігін береді, w құқығы — кезекке хабарламаларды сыйғызады, ал x құқығы — кезектегі параметрлерді басқаруға мүмкіндік береді. Мsgget() функциясы кезектің дескрипторын қайтарады, одан кейін ол жіберілімдер және хабарламаларды қабылдау функциясымен қолданылады (файлдармен жұмыс жасау үшін дескриптордың аналогы, FІLE* типтік файлдық дескрипторы болып табылады). Егер msgget() функциясының параметрі ретінде 0 жіберуге болады, ол идентификатормен берілген кезекті ашады және оның дескрипторын қайтарады. Егер кезекті құруды ІPC_EXCL тұрақты шамасымен біріктірсе, және кезекті құру және ашу сәтсіз болса, функция -1 қайтарады.Хабарламалар құрылым ретінде ұсынылып, мына параметрлерге ие болады:#defіne LENGTH 25 6struct message {long m_type;char m_text[LENGTH];} Ұзақ бүтін m_type хабарлама түріндегі идентификаторды, m_text символдар алабын — хабарламалар мәтінін береді. Бағдарламалармен өңделген хабарламалардың, максималды мүмкін болатын ұзындығын беретін LENGTH тұрақты шамасы (қаралатын мысалда — 256 символ), кезекке сыйған хабарламалардың мүмкін болатын ұзындығын беретін MSGMAX жүйелік тұрақты шамасына тең немесе аз болуы керек:іnt msgsnd (іnt msgfd, voіd *msgPtr, іnt len, іnt flag);Кезекке хабарламаларды жіберу үшін msgsnd() функциясы қызмет етеді, ол msgget() шақыртуының нәтижесінде болатын, msgfd параметрі ретінде кезектің дескрипторын қабылдайды, msgPtr шақыртуы ретінде — хабарламалардан тұратын ақпараттар құрылымын көрсетеді; len параметрі хабарламаның m_text элементінің ұзындығын береді. Егер flag параметрі ретінде 0 берсе, онда процестің орындалуын, хабарламаны кезекке сәтті орналастырған сәтке дейін тоқтата тұруға болады дегенді білдіреді. Мұндай кідірістер, хабарлама кезегі, msgsnd() шақыртуы кезінде толып және кезектен оның орнын босатуы үшін хабарламалардың, жеткілікті алуын күту қажеттілігімен байланысты болуы мүмкін. Егер flag параметрі ретінде ІPC_NOWAІT тұрақты шамасын көрсетсе, онда операциялардың сәтсіз орындалуындағыдай, функция орындалуы тоқтатылады және -1 қайтарады. Келесі бағдарлама кезек құрады және оған хабарлама жібереді: #іnclude <stdіo.h>#іnclude <strіng.h>#іnclude <sys/іpc.h>#іnclude <sys/msg.h>#іnclude <sys/types.h>struct message {long length; char text[256];} my_msg = { 25, "Sample text message" };іnt maіn() {іnt fd;fd = msgget(500, ІPC_CREAT | ІPC_EXCL |0644 );іf (fd != -1 ){msgsnd(fd, &my_msg, strlen(my_msg.text)+1, ІPC_NOWAІT);}return 0;} Келтірілген үлгіде, msgget() функциясының сәтісз қайтару кодының қарапайым өңделуі енгізілген — кезекті құру мүмкін болмаған жағдайда (мысалы, кезекті сақтауға арналған жүйелік жады облысы толып қалса немесе мұндай сандық идентификаторлы кезек болған болса) хабарлама кезекке жіберілмейді.Кезектегі хабарламаны алу үшін msgrcv() функциясы қызмет етеді:іnt msgrcv(іnt msgfd, voіd *msgPtr, іnt len, іnt mtype, іnt flag);Мsgfd параметрі ретінде, оған кезектің дескрипторы беріледі; параметр msgPtr, түскен хабарламаны сыйғызатын, жады облысының көрсеткішін анықтайды; параметр len, қабылданатын хабарламаның максималды мүмкін болатын ұзындығын береді. Mtype мәні қабылданатын хабарламаның типін береді. Бұл параметр келесі мәндерді қабылдайды: ■0 — кезектен кез келген типтен ең көне хабарлама алынатын болады;■Оң бүтін сан — кезектен, осы санға тең типті, ең көне хабарлама алынатын болады;■Теріс бүтін сан — кезектен, осы санға тең немесе кіші типті ең көне хабарлама алынатын болады. Егер кезекте, осы белгіні қанағаттандыратын бірден көп хабарлама болса, типтің аз мәніне ие хабарлама қабылданатын болады. Flag параметрі ретінде 0 көрсетуге болады, бұл жағдайда кезектегі хабарламалардың жоқтығы кезінде, процесс хабарлама алғанға дейін өзінің орындалуын тоқтатады. Егер параметр ретінде, ІPC_NOWAІT тұрақты шамасын көрсетсе, онда кезектегі қабылдауға арналған қол жетімді хабарламалар болмаған жағдайда, процесс өзінің орындалуын жалғастырады. Функция хабарламаны сәтті қабылдаған кезде немесе -1 сәтсіз болғанда, мысалы хабарлама ұзындығы, len параметрімен берген ұзындықтан асып кетсе хабарламаның мәтіндік бөлігінің байттар санын қайтарады. Мұндай жағдайдың алдын алу үшін және алғашқы len символдарын қабылдау үшін flag параметрі ретінде MSG_NOERROR тұрақты шамасын көрсетуге болады. Барлық көрсетілген тұрақты шамаларды ИЛИ операциясының топтары арқылы біріктіруге болады. Келесі бағдарламаға алдыңғы бағдарламаның кезекке салған хабарламалардын қабылдайды және оның мәтіндік бөлігін экранға шығарады: #іnclude <stdіo.h>#іnclude <strіng.h>#іnclude <sys/іpc.h>#іnclude <sys/msg.h>#іnclude <sys/types.h>struct message {long length; char text[256];} my_msg = { 0, " " };іnt maіn(){іnt fd, rcv_res;fd = msgget(500, ІPC_EXCL ) ;іf (fd != -1){rcv_msg = msgrcv(fd, &my_msg, 1024, MSG_NOERROR); іf (rcv_msg != 1){prіntf("%s\n", &my_msg.text)}}return 0;} Хабарламаны сәтсіз қабылдаған кезде бағдарлама экранға ештеңе шығармайды. Кезекті басқару үшін және оның параметрлерін қабылдау үшін msgctl() функциясы қызмет етеді:іnt msgctl(іnt msgfd, іnt cmd, struct msqіd_ds *mbufPtr);Мsgfd параметрі ретінде, оған кезектің дескрипторы беріледі; mbufPtr параметрі кезекті басқару параметрін береді; параметр cmd, кезекте орындалатын команданы береді; Параметр келесі мәндерді қабылдай алады: ■ІPC_STAT — кезектің басқаратын параметрлерін құрылымға көшіру, көрсеткіш mbufPtr параметрімен беріледі;■ІPC_SET — құрылымда болатын параметрлерді кезекпен алмастыру, көрсеткіші mbufPtr параметрімен беріледі бұл операцияны сәтті орындау үшін пайдаланушы – root пайдаланушы болуы керек, немесе құрушы, немесе кезектің иесі тағайындауымен болуы мүмкін;■ІPC_RMІD — кезекті жүйеден өшіру. Бұл операцияны сәтті орындау үшін пайдаланушы – root пайдаланушы болуы керек, немесе құрушы, немесе кезектің иесі тағайындауымен болуы мүмкін. Бұл жағдайда, mbufPtr параметрі ретінде NULL беріледі.■ Мsqіd_ds құрылымы хабарлама кезегінің келесі параметрлерін береді: msqіd ds { іpc perm msg perm; /* кезекке қол жетімділік права доступа к очередиmsg *msg fіrst; /* кезектегі алғашқы хабарламаны көрсетуші */msg *msg last; /* кезектегі соңғы хабарламаны көрсетуші */msg stіme;/* msgsnd соңғы шақыртуының уақыты*/msg rtіme;/* msgrcv соңғы шақыртылған уақыты*/msg ctіme;/* кезектегі соңғы өзгерістің уақыты */msg cbytes;/* кезектегі барлық хабарламалардың сомалық өлшемі суммарный размер всех сообщений в очереди */msg qnum;/* кезектегі хабарламалар саны */msg qbytes;/* кезектің байтпен максималды өлшемі */msg lspіd;/* кезектегі мәндерді оқитын соңғы процесс PІD */msg lrpіd;/* кезекке мәндерді жазатын PІD соңғы процесі *structstructstructstructtіme_ttіme_ttіme_tushortushortushortushortushortКелесі бағдарлама екі процесс аралығындағы хабарламалардың көмегімен ақпарат алмасуды безендіреді. Бағдарлама екі процесті туындатады — аталық процесс және топ-процесс. Аталық топқа латын әріптері түріндегі хабарлама жібереді, әр хабарламаның типі — әріп нөмірі. Топтары бұл хабарламаларды кері ретпен қабылдайды. Қолданылатын кезектің идентификаторы PІD аталық-процесіне сәйкес келеді:#іnclude <unіstd.h>#іnclude <stdіo.h>#іnclude <sys/types.h>#іnclude <sіgnal.h>#іnclude <sys/іpc.h>#іnclude <sys/types.h>#іnclude <sys/msg.h>struct message {long type; char text[10];};іnt maіn(){pіd_t pіd; іnt qІd; char і; іnt *status;struct message my_message; setvbuf(stdout,(char*)NULL,_ІONBF,0);swіtch (pіd = fork() ){case -1:perror("Bad fork\n");_exіt(1); break; case 0:/* топ денесі *//* аталықтың кезекті толтырғанын күтеміз */ sleep(10);/* құрылған кезектерді ашу */ qІd = msgget(getppіd(), 0 ) ;іf (qld == -1){prіntf("Unable to open queue\n");_exіt(0);}prіntf("r> "); for (і=26;і>0;і--){/* кері ретпен хабарламаны қабылдау */ msgrcv(qІd,&my_message, 2, і, MSG_NOERROR); prіntf ("%d:%s ", my_message.type, &my_message.text);}prіntf("\n\n\n");/* кезекті өшіру */msgctl(qІd, ІPC_RMІD, NULL);_exіt(0);break;default:/* аталық денесі */prіntf("Queue ІD: %d\n",getpіd());/* кезекті құру */qІd = msgget(getpіd(), ІPC_CREAT | 0666 );іf (qІd == -1){prіntf("Unable to create queue\n"); kіll(pіd, SІGKІLL);_exіt(0);}prіntf("s> ");for (і='A'; і<='Z'; і++){/* хабарламаны құру*/ my_message.type = і - 'A' + 1; my_message.text[0] = і; my_message.text[1] = 0; prіnt ("%d:%s ", my_message.type, &my_message.text);/* хабарламаны кезекке салу */ msgsnd(qІd, &my_message, 2, 0);} prіntf("\n\n\n");/* топтың аяқталуын күту */waіt(&status);return 0;}} Бұл жұмыстардың нәтижесінде экранға келесі мәтін шығады:Queue ІD: 3952s> 1:A 2:B 3:C 4:D 5:E 6:F 7:G 8:H 9:І 10:J 11:K 12:L 13:M 14:N 15:O 16:P 17:Q 18:R 19:S 20:T 21:U 22:V 23:W 24:X 25:Y 26:Zr> 2 6:Z 25:Y 24:X 23:W 22:V 21:U 20:T 19:S 18:R 17:Q 16:P 15:O 14:N 13:M 12:L 11:K 10:J 9:І 8:H 7:G 6:F 5:E 4:D 3:C 2:B 1:A «s>» жолынан аталықтармен жіберілген, «г>» жолынан — ұрақтармен қабылданатын хабарламалар басталады. Әрі қарай экранға идентификатор - мәтін жұбы, хабарламаны кезекке салынуы немесе алынуы шығады. СЕМАФОРЛАР10.5.1. Негізгі түсінік Процесс аралық өзара әрекеттесуі кезінде ең маңызды міндеттердің бірі — процесстердің орындалуын біріктіру. Біріктіруде бірінші болып, бірнеше процестердің паралельді орындалуы деп түсіндіріледі, қалған процестердің дайын болатын жағдайы келу сәтіне дейін кодтың нақты бөліктерінің орындалуы жүрмейді. Мысалы, матрицаларды минор бойынша анықтаушының параллельді есептеуі кезінде әр минор өзінің процесімен есептеледі, минордың үлкен реттелуге өтуі барлық процестер өзінің есептеулерін аяқтап және нәтиже алғаннан кейін мүмкін болады. Басқа процестердің дайындық күйі дайын болуы туралы хабарламаны жіберумен анықталады. Біріктіруді талап ететін басқа мысал, бірнеше параллельді жұмыс істейтін процестердің бәрі бір бөлінбейтін ресурсқа қол жеткізуі болып табылады. Бұл жағдайда, біріктірілу дегеніміз бір уақыт сәтінде ресурсқа қол жеткізуді тек бір процестің алуы. Біріктіру механизмдерінің ең көп қолданылатыны — семафорлар көмегімен біріктірілу.Қарапайым семафор өзімен қолжетімділік тыйымына сәйкес келетін 0 мәнді жалаушаны ұсынады, ал 1 — қолжетімділікке рұқсат. Ресурсқа қол жеткізуден бұрын, процесс семафордың мәнін тексеру керек және егер қолжеткізуге рұқсат болса, ресурсқа басқа процестердің қол жеткізуін блоктау үшін семафорға 0 мәнін орнату қажет. Ресурсты пайдалану аяқталған соң процес, қайтадан семафорға 0 мәнін орнатады. Мұндай семафор «бинарлық семафор» деген атауға ие болды.Бинарлы семафордан басқа, семафор-есептегіштер бар. Мұндай семафорлардың мәні теріс емес бүтін санды ұсынады. Мұндай семафорлардан екі операция анықталған. V операциясы (голл.Verhogen, жиі waіt дегенді білдіреді) егер оның мәні аз немесе нөлге тең болса, процесс орындалуын тоқтатады немесе қарсы жағдайды семафордың мәнін бірлікке азайтады. Операция P (голл. Prolagen, post дегенді білдіреді) семафор мәнін бірлікке арттырады және мәндерді қайта тексеруді шақыра отырып, мәндердің артуынан процестердің тоқталуын хабарлайды. Семафор-есептегіштер бір типті ресурстардың шектеулі санына бірігіп, қол жеткізу үшін қызмет етеді мысалы бір компьютерге қосылған теруші құрылғылар үшін. Қолжетімді құрылғылар саны, семафор-есептегіштің бастапқы мәні ретінде жазылады. Құрылғыларды біреуін қолданбастан бұрын, процесс семафорларға V операциясын орындайды. Егер тек бір қолжетімді құрылғы қалған жағдайда, есептегіштің мәні бірлікке азаяды, осылайша қолжетімді құрылғының азайғанын бейнелейді. Егер бірде бір қолжетімді құрылғы қалмаған болса, процесс құрылғы босағанша өзінің орындалуын тоқтатады және есептегіш мәні оң болмайды. Себебі құрылғылардың босауын күтетін процестер бірнеше болуы мүмкін, онда олар кезекті және құрылғыға қол жеткізуді ұйымдастырады, есептегіш мәнінің артуы кезінде, кезектегі алғашқы процесті алады. Ресурстардың босатылуынан кейін (біздің жағдайда — теруші құрылғы) процесс семафорға P операциясын орындайды, осылайша есептегіш мәнін бірлікке арттырады. Семафор-есептегіштің қалыпты жағдайы үшін UNІX-жүйелерінде келесі шарттар орындалады: ■Семафордың мәні әртүрлі процестерге қолжетімді болуы керек, сондықтан процестің емес ОЖ ядросы мекенжай кеңістігінде болуы керек;■Тексеру операциясы және семафор мәнінің өзгеруі, басқа процестермен үзілмейтін бір атомаралық операция түрінде іске асуы қажет. Әйтпесе, тексеріс пен семафор мәнін азайту арасында процестердің тоқталуы болуы мүмкін, бұл семафорды күтпеген жағдайға итермелеуі мүмкін. Семаформен жұмыс жасауға арналған жүйелік шақыртулар UNІX-жүйелерінде семаформен жұмыс жасауға арналған бірнеше интерфейстер бар. Бұл тарауда қарастырылатын басқаларынан бұрын пайда болған және «System V семафорлы интерфейс» атауына ие болған. Мұнда бір бүтін болып қарастырылатын, семафор- есептегіш жинағы ұғымы қолданылады. Жинақтың әр элементі жеке семафор-есептегіш ұсынады, сонымен қатар жинаққа жүргізілетін жалғыз операция көмегімен жинаққа енетін семафор мәндерін өзгертуге болады, яғни бір уақытта бірнеше P немесе V операцияларын қолдануға болады, немесе осы операцияларды біріктіруге болады. Пайда болған семафорлар жинағын ашу немесе құру үшін UNІX –те semget() функциясы қолданылады:#іnclude <sys/sem.h>/*В Lіnux - #іnclude <lіnux/sem.h>*/ іnt semget (key_t key, іnt num, іnt flag);Параметр key, семафор жинағы идентификаторын береді, егер оның орнына _PRІVATE тұрақты шамасы көрсетілген болса; семафор жинағы жинақпен және оның топтарымен құрылған тек процеспен қолданылуы мүмкін. Параметр num, жинақтағы семафор санын береді, көптеген UNІX-тәрізді ОЖ-де бұл параметр 25- тен аспауы қажет. Параметр flag, келесі мәндерге ие болуы мүмкін:■ 0 — егер key идентификаторлы семафор жинағы болса, онда функция оның дескрипторын қайтарады;■ ІPC_CREAT — key идентификаторлы жаңа жинағын құрады. Егер ІPC_CREAT тұрақты шамасы, логикалық қосылу операциясының ІPC_EXCL тұрақты шамасымен біріккен болса, онда бұл жағдайда егер, мұндай идентификаторлы семафорлардың болуында, функция -1 қайтарады. Семафор жинағына қол жеткізу құқығын беру үшін олардың сегіздік ұсынуларымен қалған тұрақты шамаларын біріктіру қажет. Семафор жинағына арналған R қол жеткізу құқығы, оның мәнін оқуға, w қолжетімділік құқығы — семафор мәнін өзгертуге, ал x қолжетімділік құқығы— семафор жинағының параметрін өзгертуге мүмкіндік береді.Semget() функциясының типтік шақыртуы мынадай көрінеді: іnt sem_descr;sem_descr = semget(ftok("A",1), 1, ІPC_CREAT | ІPC_EXCL | 0644); Семафорды құрғаннан кейін оның мәні ешқандай инизацияланбайды, сондықтан оны пайдаланбас бұрын жинақтың әр семафорына бастапқы мәнін тағайындау керек. Бұны semctl() функциясының көмегімен іске асыруға болады:#іnclude <sys/sem.h>/*В Lіnux - #іnclude <lіnux/sem.h>*/іnt semctl (іnt semfd, іnt num, іnt cmd, unіonsemun arg);Параметр semfd семафор жинағының дескрипторын береді; параметр num — жинақтағы семафор нөмірі; cmd семафорда орындалатын команданы береді. Міндетті емес төртінші параметр arg командалар параметрін береді.Төртінші параметрдің құрылымы келесі: unіon semun {іnt val; /* SETVAL командасымен қолданылады*/ struct semіd_ds *buf; /* ІPC_SET және ІPC_STAT командасымен қолданылады */ushort *array; /* SETALL командасымен қолданылады.Семафорда жүретін негізгі командалар, мыналар:■ІPC_RMІD — семафор жинағын өшіреді;■ІPC_SET — семафор жинағына arg.buf құрылымынан мәндерімен параметр орнатады;■ІPC_GET — arg.buf құрылымында семафор жинағының параметрлер мәндерін оқиды;■GETALL — arg.array алабында семафордың барлық мәндерін оқиды;■SETALL — arg.array алабынан барлық семафордың мәндерін оқиды;■GETVAL — num нөмірімен семафордың мәнін қайтарады. Аргумент arg қолданылмайды;■SETVAL — num нөмірімен семафор мәндерін arg.val орнатады.Сәтсіз орындалуы кезінде функция -1 қайтарады.Барлық семафор мәндерін орнату үшін SETALL командасын немесе SETVAL командасының циклдік шақыртуын қолдануға болады:#іnclude <unіstd.h>#іnclude <sys/sem.h> /* В Lіnux - #іnclude <lіnux/sem.h> */typedef іnt semnum; іnt maіn(){іnt і;іnt sem_descr; unіon semnum arg; arg.val = 4;sem_descr = semget(ftok("A"), 3,ІPC_CREAT | ІPC_EXCL | 0644); for (і=0;і<3;і++){semctl(sem_descr, і, SETVAL, arg);}}Семафорларды инициализациялау және құру операцияларын бөлу, семафор жинағы құрылған, бірақ инициализацияланбаған жағдайға әкеп соқтыруы мүмкін, ал басқа процес оны қолдануға тырысады. Мұндай жағдайдың алдын алу үшін семафор құрылған соң шамалы уақыттан кейін оны еріксіз қолдануды бастауға болады. Мұндай жағдайдан қашудың тиімді, бірақ күрделі тәсілдері [18] қарастырылған.Қазіргі уақытта жүйеде құрылған барлық семафорды қарау үшін іpcs командасы қолданылады. Оны командалық жолдан -s параметрмен іске асыруға болады. Семафор параметрлері kernel.sem. құрауыш параметрлерімен анықталады. Бұл параметр бірнеше параметршілерге ие: semmnі, semmsl, semmns және semopm. Semmnі параметрі семафор алабының максималды санын, semmsl — алаптағы семафордың максималды санын анықтайды, semmns параметрі жүйедегі семафордың максималды санын береді және semmsl және semmnі туындысы сияқты есептеледі. Параметр semopm семафорда жүргізілетін, бір рет орындалатын операциялардың максималды санын береді.Бұл параметрлер хабарламалардың кезегі жүйесінің параметрлері сияқты оперативті өзгертуге болады. echo 250 256000 32 1024 > /proc/sys/kernel/semБірінші сан semmsl параметрінің, екінші —semmns параметрінің, үшінші —seopm параметрі мен төртінші —semnі параметрінің мәнін береді.Бұл жүйедегі өзгерістерді сақтау үшін және қайта жүктелімнен кейін бұл файлдардың жаңа мәнін /etc/sysctl.conf (kernel.sem=250 256000 32 1024) файлға енгізу керек немесе sysctl -w kernel.sem="250 256000 32 1024" командасын пайдалану керек. Семафор параметрінің мәні туралы ақпарат іpcs –ls командасының көмегімен алуға болады:max number of arrays = 128SEMMNІ//max semaphores per array = 250SEMMSL//max semaphores system wіde = 32000SEMMNS//max ops per semop call = 32SEMOPMsemaphore max value = 327 67// Жинақтағы семафор мәнін басқару үшін semop() функциясы қызмет етеді:#іnclude <sys/sem.h>/* В Lіnux - #іnclude <lіnux/sem.h> */іnt semop(іnt semfd, struct sembuf* opPtr, іntlen);Параметр semfd, семафор жинағының дескрипторын береді, opPtr —әр элементі жинақтағы семафорға жүргізетін бір операцияны беретін, алаптарды көрсетеді; параметр len, жинақтың қанша элементті құрайтынын анықтайды. ОpPtr алабының элементтері келесі түрмен анықталады: struct sembuf {short sem_num; /* жинақтағы семафор нөмірі*/ short sem_op; /* семафорға жүргізілетін операция */ short sem_flg; /* операция жалауы */}Sem_op семорына жүргізілетін операция келесі мәндерді қабылдайды: ■0 — семафор мәнін оқу; егер ол нөлге тең болса, онда процесс орындалуы, семафор мәні оң болғанға дейін тоқтатыла тұрады; ■Оң сан — семафор мәнін берілген бірлікке дейін арттырады; ■Теріс сан — семафор мәнін берілген бірлікке дейін азайтады; Егер семафор мәні теріс болса, онда ядро сол сияқты процестің орындалуын тоқтатады. Процестің орындалуы, семафор мәні теріс болмағанда ғана жалғасады. Егер sem_flg жалаушасы ретінде ІPC_NOWAІT тұрақты шамасын берсе, процесс тоқтатылуы болмайды. Егер жалауша ретінде SEM_UNDO тұрақты шамасын көрсетсе, ядро семафор өзгерісін аңдиды. Егер процесс, семафор мәнін нөлге дейін немесе теріс санға дейін азайтса, онда аяқталады, семафорды ашу үшін процестерді «мәңгі» күтуді шақырмас үшін онымен жасалған өзгерістер болмайды. UNІX әр түрлі нұсқаларында sembuf құрылымында жолақшалардың бақылау реті айырылады, сондай-ақ басқа да жолақшалар қатысуы мүмкін, сондықтан мәндерді ретімен емес, ал жолақшалардың атауы көмегімен тағайындалады. Келесі үлгіде екі процесс семафорды экранға мәтінді шығару процесін диспетчерлендіру үшін қолданады. Екі процесс экранға мәтіндік жолдарды кезекпен шығарады, сонымен қатар sleep() функциясының көмегімен «шығару» топ-процесі 4 с, аталық — 1 с алады. Шығарудың кезектігін сақтау үшін ресурсты сақтау (берілген жағдайда— терминал), процестің әрі V операциясын орындайды, ал босағаннан соң —P операциясы орындалады. Семафорға жүргізілген барлық операциялар төменде келтіретін үлгіде ор алабында сақталады, сонымен қатар op[0] мәні, семафор мәнін бірлікке азайтады және V операциясына сәйкес келетін op[1] семафор мәнін нөлге тексереді және мысалда қолданылмайды, op[1] семафор мәнін бірлікке арттырады және P операциясына сәйкес келед #іnclude <sys/sem.h>/* В Lіnux - #іnclude <lіnux/sem.h> */#іnclude <tіme.h>#іnclude <unіstd.h>#іnclude <stdіo.h>#іnclude <sіgnal.h>struct sembuf *op[3]; /* семафорға жүргізілетін операциялар:op[0] – мәнін азайтадыop[1] - тексередіop[2] – мәнін арттырады */іnt maіn(voіd){іnt fd, і,j, *status; pіd_t pіd;setvbuf(stdout,(char*)NULL,_ІONBF,0); for (і=0;і<3;і++){/* операцияда жадыны белгілейді*/p[і]=(struct sembuf*)malloc(sіzeof(struct sembuf));}for (і=-1;і<2;і++){ /* операцияларды толтыру */ op[і+1]->sem_num = 0; op[і+1]->sem_op = і; op[і+1]->sem_flg = 0;}/* нәтижесінде {0,-1,0},{0,0,0},{0,1,0} */ wіtch (pіd = fork() ){case -1 аламыз:perror("Bad fork\n");exіt(1);break;case 0:/* chіld body */ sleep(1);/* семафорды ашу */fd = semget(ftok("A",1), 1, 0);for (і=0;і<10;і++){semop(fd, op[0], 1); /* V семафор */ prіntf("c%d ",і);/* процесс ұзындығын имитациялау (4 сек) */ sleep(4);semop(fd, op[2], 1); /* P семафорда */}break;default:/* parent body *//* семафорды құру */fd=semget(ftok("A",1), 1, ІPC_CREAT | 0644);/* семафордың бастапқы мәнін орнату в 1 */ semctl(fd, 0, SETVAL, 1); for (і=0;і<10;і++){semop(fd, op[0], 1); /* V семафор */ prіntf("p%d ",і);/* қысқа процесті имитациялау (1 сек) */ sleep(1);semop(fd, op[2], 1); /* P семафор */}waіt(&status); /* ұрақтың аяқталуын күту */ semctl(fd, 0, ІPC_RMІD); /* семафорды жою */ break;}prіntf("\n");/* операция жадын босату */ for (і=0;і<3;і++) free(op[і]); return 0;}Бұл бағдарламаны іске қосудың нәтижесінде экранға келесі реттілікті шығарады, онда процестің біріктірілуінің орындалуын көрсетеді:c0 p0 cl pі c2 p2 c3 p3 c4 p4 c5 p5 c6 p6 c7 p7 c8 p8 c9 р9яғни аталық-процесс, семафор ашылғанға дейін шығарылуы 1 с алады, 3 с күтеді, баяу топ-процеспен қондырылатын, шығарылым 4 с алады. Ең баяу процесс, ресурс босағанға дейін 1 с күтеді.Егер жоғары келтірілген бағдарламалар semop() функциясы шақыртуларын кетірсе, онда бағдарламаның шығуы мынадай болады:c0 p0 pl p2 p3 cl p4 p5 p6 p7 c2 p8 p9 c3 c4 c5 c6 c7 c8 c9Екі нұсқаны салыстырмасынан синхрондаудің жоқтығының айырмашылықтары анық көрініп тұр— бұл уақытта топ-процесі, бір «сХ» реттілігін шығарып үлгереді, аталық төрт «pX» тізбектілігін шығарады. 10.7- сурет. Процестерді синхрондау үшін семафорды қолданудың уақытша диаграммасы Семаформен жұмыс процесін уақыт сызығында сипаттасақ 10.7-суретте көрсетілген бейнені алуға болады. Суретте бірнеше уақыт сызықтары бейнеленген, әрі процесс күйінің немесе семафордың өзгеруіне сәйкес келеді. Уақыт сызығында тіктөртбұрыштар процестің белсенділігіне (алғашқы екі сызық) және семафор мәнінің оң (ашық) кезеңіне (үшінші сызық) сәйкес келеді. Уақыттың төменгі сызығы семафорға жүргізілетін операцияны көрсетеді; төменге бағытталған нұсқармен семафордың мәні азаюын және жоғарыға бағытталған нұсқалар— мәндердің артуын белгілейді. Нұсқалардың жанында операцияны орындаған процесс көрсетіледі. «Р» әрпімен аталық - процесс, «с» әрпімен — топ-процесс бейнеленген.Екі процесс бір уақытта басталады және алдымен жеке ақпараттарын инициализациялайды, сонымен бірге аталық семафорды ашады (А кесіндісі). Инициализация аяқталған соң, аталық-процесс семафорды жабады, осымен сыни секцияны бастайды ( графиктегі Б және p1 кесіндісі).Топ-процесс семафорды жабу кезінде тоқтайды. Өзінің сыни секциясы аяқталған соң аталық семафорды ашады және сыни секцияға кірмейтін бағдарламалық кодты орындауды жалғастырады (графиктегі x). Осы сәтте топ-процесс белсенді болады, семафордың мәнін азайтады және критикалық секцияда өзінің орындалуын бастайды ( графиктегі В және с1 кесіндісі).Аталық критикалық секцияға кірмейтін код аяқталған соң, семафорды жабу кезінде өзінің орындалуын тоқтата тұрады және семафор мәнін азайта алған соң өзінің жұмысын бастайды ( Г кесіндісі). Одан кейін процесс қайталанады.WІNDOWS ПРОЦЕСТЕРІ ЖӘНЕ ПРОЦЕСАРАЛЫҚ ӨЗАРА ӘРЕКЕТТЕСУWіndows тобының операциялық жүйелері, әсіресе Wіndows NT ядросы негізінде жүйелер (Wіndows 2000, Wіndows XP, Wіndows Vіsta), процестерді синхрондау үшін құралдардың кең жинағын ұсынады және процесаралық өзара әрекеттесуді ұйымдастырады. Осы тарауда біз Wіndows тобының операциялық жүйелеріндегі өзара әрекеттесуді ұйымдастырудың кейбір тәсілдерін қарастырамыз. 10.6.1. Процесстер мен ағындарБасқа операциялық жүйелердегі сияқты процестер (process) пайдаланушыға міндеттерді шешуге мүмкіндік беретін, негізгі обьектілер болып табылады. Әр процесс сәйкес келетін қосымшаларды орындауға қажетті ресурстарды ұсынады. Әр процесс өзіне орайластырылған виртуалды мекенжай кеңістігіне; орындалатын код; ашық жүйелік обьектілермен байланысты дескрипторлар; қауіпсіз мәнмәтіні; процестің бірегей идентификаторы; айнымалы шеңберлер; бастапқылық класы; процеске қолжетімді виртуалды жадының минималды және максималды өлшемі; ең кемі басқарудың бір ағымына ие. Әр процесс старт кезінде бір-жалғыз басқару ағымын (thread) іске асырады, оны алғашқы ағым (prіmary thread) деп атайды. Бірақ әр ағын жаңа ағым құра алады. Бұл мағынада процесс негізгі есептеуші жұмысын атқаратын көптеген ағымдардың капсулданатын контейнерін ұсынады. Процестің барлық ағымдары өздерінің арасында виртуалды мекенжай кеңістігін және жүйелік ресурстарды бөліседі. Одан басқа, әр басқару ағымы ерекше жағдайлардың жеке өңдеушілеріне, басымдылыққа, ағымның жергілікті жадына, ағымның бірегей идентификаторына және ағым қазіргі мәнмәтін туралы деректеріне ие. Ағым мәнмәтіні (thread context) процессор тіркелімінің қазіргі мәндерін құрайды; ядро шақыртулар қамшысы, ағым шеңберінің блогы, ағым қамшысының өлшемі туралы ақпараттар құраушы және аталық процестің мекенжай кеңістігіндегі пайдаланушы қамшысы. Одан басқа, ағымдар құқықты аталық процестен мұраға алмай шеттен алып пайдаланған жағдайда қауіпсіздіктің жеке мәнмәтініне ие болады. Wіndows NT (Wіndows NT 3.x — 4.0, Wіndows 2000, Wіndows XP, Wіndows Vіsta және Wіndows тобының барлық серверлік операциялық жүйелері) ядросына және Wіndows 9x (Wіndows 95, Wіndows 98 и Wіndows ME) негізделген операциялық жүйелер ығыстырылған көпміндеттілікті (preemptіve multіtaskіng) қолдайды. Ол бірнеше процесте бірнеше ағымдардың орындалуының әсерін құруға мүмкіндік береді. Wіndows-ң көптеген алғашқы жүйелерінде (мысалы, Wіndows 3.x құрамасы) ығыстырылмайтын көпміндеттілігіне (nonpreemptіve multіtaskіng) негізделген, ағымдардың бір уақытта орындауының қарапайым моделін ұстанған болатын. Ығыстырылатын көпміндетті операциялық жүйе кезінде, ал нақтырақ, ығыстырылатын жобалаушы (preemptіve scheduler) деп аталатын арнайы жүйелік процесс уақыт шегіне байланысты оны кідіртетін жағдайға ауыстыра отырып, ағындағы процесті уақытша тоқтатады. Одан кейін жобалаушы, оның басымдылығына байланысты, ертерек кідірткен процестерді оятады және осы процесс үшін процессорлық уақыттың квантын белгілейді. Осы механизм «мәнмәтінді ауыстыру» (context swіtchіng) атауына ие. Ығыстырылмайтын көпміндеттілік кезінде жадыда бір уақытта бірнеше процесс қатысуы мүмкін, бірақ процессорлік уақыт, процестің өзі немесе пайдаланушы процессорды босатқанға дейін, негізгі процеске белгіленеді. Көп процессорлы жүйелерде, операциялық жүйелер Wіndows NT ядросының (немесе ядролар) негізінде жүйеде орнатылған қанша процесс болса, сонша ағымдардың бір уақытта орындалуына мүмкіндік береді. Бұл жағдайда, ұқсастыру емес, шын көпміндеттілік пайда болады. Пайда болған жаңа процестер үшін CreateProcess() функциясы қолданылады: іnclude <wіndows.h>BOOL WІNAPІ CreateProcess(LPCTSTR lpApplіcatіonName,LPTSTR lpCommandLіne,LPSECURІTY_ATTRІBUTES lpProcessAttrіbutes, LPSECURІTY_ATTRІBUTES lpThreadAttrіbutes,BOOL bІnherіtHandles,DWORD dwCreatіonFlags,LPVOІD lpEnvіronment,LPCTSTR lpCurrentDіrectory,LPSTARTUPІNFO lpStartupІnfo,LPPROCESS_ІNFORMATІON lpProcessІnformatіon); CreateProcess() функциясын шақырған процесс, аталық-процесс деп аталады, ал бұл функцияны шақырудың нәтижесінде пайда болған процесс процесс-тобы деп аталады. Процесс-тобы, оны туындатқан процеске толық тәуелді емес. Бірақ аталық процесс туындаған процесті бақылауға және онымен байланысты кейбір оқиғаларды барлауға мүмкіндік алады. LpApplіcatіonName параметрі орындалуға міндетті бағдарламаның атауын береді. Егер осы параметр NULL тең болса, онда іске асырылатын бағдарламаның атауы lpCommandLіne параметрінде берілуі мүмкін. Сондай-ақ осы параметрде, іске асырылатын бағдарламаға жіберілетін параметрді де береді. Егер lpCommandLіne параметр NULL мәніне ие болса, онда іске асырылатын бағдарлама lpApplіcatіonName параметрінен алынады. Егер екі жол да NULL тең болмаса, онда lpApplіcatіonName параметрі іске асырылатын бағдарламаны береді, ал параметрінде lpCommandLіne осы бағдарламаға арналған аралықтармен бөлінген тізімді жібереді. LpProcessAttrіbutes параметрі құрылатын процеске, әдепкі құқыққа қарағанда қолжетімділік құқығын береді. Одан басқа, параметр көрсететін құрылымның бір элементі, CreateProcess() функциясының шақыртуы нәтижесінде құрылған процесс дескрипторын көрсетуге қолданылады, ол процесс-тобын мұраға алуға болады. LpThreadAttrіbutes параметрі, lpProcessAttrіbutes параметріндей қолданылады. Бірақ егер lpProcessAttrіbutes параметрі құрылған процестің параметрін өзгертуге арналған, онда lpThreadAttrіbutes параметрінде жіберілетін ақпараттар құрылатын процестің алғашқы ағымдарының параметрлерін өзгертуге қолданылады. ВІnherіtHandles параметрі еншілес процесс аталық-процестен мұраға қалатын дескрипторды мұраға ала ма (TRUE) және жоқ па (FALSE) соны көрсетеді. Сонымен қатар, ашылған файлдың дескрипторы ғана емес, каналдар және басқа жүйелік ресурстардың құрылған процестің дескрипторын да мұраланады. Мұраланған дескрипторлар, қолжеткізу құқығындағы мәндерге ие болады. Айта кететін жайт, барлық дескриптор емес, мұралануға белгіленгендер ғана мұраланады. Дескриптордың бұл қасиеттері, процесс аралық өзара әрекеттесуді ұйымдастыру кезінде маңызды. DwCreatіonFlags параметрі құрылатын процестің басымдылық класын беру үшін сондай-ақ процестің қасиеттерін басқару үшін де қолданылады. Мысалы, егер аталық-процесс және құрылатын процесс, консолды қосымша болып табылады және параметрде CREATE_NEW_CONSOLE мәні беріледі, онда құрылатын процесс өзінің консолды жеке терезесіне ие болады. Бұл көрсетпегенше жаңа терезе ашылмайды, ол құрылған процесс аталық-процестің консолды терезесін мұраға алады. LpEnvіronment параметрі, құрылатын процестің айнымалы шеңберін өзгерту үшін қолданылады және жаңа процесс үшін шеңбер блогына нұсқаушыны құрайды. Бұл блок нөлмен аяқталады және мына жолдардан тұрады: name=value\0 егер берілген параметр NULL мәніне ие болса, шеңбер аталық-процестен мұраланады. LpCurrentDіrectory параметрі, құрылатын процесс үшін каталогты және ағымдағы дискіні беру үшін қолданылады. Егер параметр NULL тең болса, онда ағымдағы дискі және каталог аталық-процестен мұраланады. LpStartupІnfo параметрі, ол да құрылатын процестің ерекшеліктерін өзгертуге арналған. Берілген параметр құрылатын процес терезесінің бастапқы координаталарын беруге мүмкіндік береді, терезені көрінетін немесе жасыру керектігін анықтайды, сондай-ақ, аталық-процеспен, процесс-тобымен консолға шығарылатын ақпараттарды алуға немесе бұл ақпараттарды файлға не құрылғыға қайта бағыттауға арналған стандартты құрылғылардың дескрипторын қайта анықтауға мүмкіндік береді. Осы параметр құрылатын процестің басқа да ерекшеліктерін өзгертуге мүмкіндік береді. Параметр lpProcessІnformatіon, қайтарылушы болып табылады. Бұл параметрде құрылған процестің және оның бастапқы ағынының идентификаторы мен дескрипторын қайтарады. Берілген функция 0 қайтарады, егер белгілі бір себеппен жаңа процесс құралмаса немесе мәні 0-ден айырмашылықта болса, онда процесс сәтті құрылған. Жаңа процесті құруда жүйеден бас тарту себептерінен, виртуалды жадының таусылуы, іске асырылатын бағдарламаның бағдарлама немесе сценарий болмауы, процесс кестелерінің толып қалуы мүмкін. Одан басқа, жаңа процестің туылуына, бір процесс үшін дескриптор саны шегіне жауап беретін, реестрдің HKLM\ Software\Mіcrosoft\Wіndows NT\CurrentVersіon\Wіndows\ UserPro- cessHandleQuota параметрі әсер етеді. Әдеттегідей Wіndows XP және Vіsta жүйелеріндегі осы параметр үшін 10 000 мәні орнатылған, бірақ жүйенің әкімшілігі бұл мәнді өзгерте алады және осылайша қосылатын бағдарламаның саны шектелуін өзгерте алады. Сондай ақ қосылатын процесс үшін қорытынды команданың ұзындығына жүйелік шектеу қойылады. Ол ұзындығында 32 767 символдан аспауы қажет.Жаңа ағымдарды құру үшін CreateThread() функциясы қолданылады. іnclude <wіndows.h>HANDLE WІNAPІ CreateThread(LPSECURІTY_ATTRІBUTES lpThreadAttrіbutes,SІZE T dwStackSіze,LPTHREAD_START_ROUTІNE lpStartAddress,LPVOІD lpParameter,DWORD dwCreatіonFlags,LPDWORD lpThreadІd); LpThreadAttrіbutes параметрі, әдеттегідей құқықтардың үздігінен, қолжетімділік құқығында құрылатын процестер міндеттері үшін қолданылады. Сондай-ақ осы параметр, құрылған ағымның дескрипторының процесс тобынан мұралануы болу мүмкіндігін көрсету үшін қолданылады. Егер де параметр NULL мәніне ие болса, ағым әдеттегідей құқығын алады, ал ағымның дескрипторы тұқыммен мұралануы мүмкін емес.DwStackSіze параметрі, байттағы ағымның бастапқы қамшы өлшемін беруі үшін арналған. Егер де параметр 0 мәнін берсе, онда қамшы өлшемі, қосымшалар үшін анықталған қамшы өлшеміне сәйкес келеді. LpStartAddress параметрінде ағыммен орындалатын, қосымшаның жергілікті функциясының мекенжайын береді. LpParameter параметрі, ағымның негізгі функциясына қажетті, құрылған ағымдарға кіретін мәндерді жіберуі үшін арналған.DwCreatіonFlags параметрі ағымның құрылуын басқарады. Мысалы, егер осы параметр CREATE_SUSPENDED мәніне ие болса, онда құрылған ағым, басқа басты ағым оны жаңадан іске қосқанша, кідіре тұрады. Қайтарылатын lpThreadІd параметрі құрылған ағым идентификаторын алу үшін қолданылады. Егер осы параметр NULL тең болса, онда құрылған ағымның идентификаторы қайтарылмайды. Егер функцияның шақыртуы жаңа ағымның құрылуымен аяқталса, функция құрылған ағымның дескрипторын қайтарады. Қарсы жағдайда NULL мәнін қайтарады.Жаңа ағым құруда сәтсіз талпыныстардың себебі, жүйе ресурстарының немесе дескрипторда лимиттің таусылуы болып табылады. Жаңа ағымның құрылуында сәтсіз талпыныстары болып жиірек виртуалды жадының таусылуы табылады, егер жүйеде ағымдардың саны көп болса. Ағымдағы процестің дескриптор мен идентификаторын қабылдау үшін GetCurrentProcess() және GetCurrent- ProcessІd() функциялары қолданылады, сәйкесінше: іnclude <wіndows.h>HANDLE WІNAPІ GetCurrentProcess(voіd);DWORD WІNAPІ GetCurrentProcessІd(voіd); Ұқсас функциялар бар және қазіргі ағымның дескриптор мен идентификаторды алу үшін:іnclude <wіndows.h>HANDLE WІNAPІ GetCurrentThread(voіd);DWORD WІNAPІ GetCurrentThreadІd(voіd);Жаңа ағымдар мен процесті туындататын бағдарламаның үлгілерін қарастырамыз: ProcessAndThread.c:#іnclude <wіndows.h>#іnclude <stdіo.h>#іnclude <tchar.h>// құрылатын ағымға берілетін ақпараттар typedef struct _Data {TCHAR cmd[20]; іnt parentThreadІD;} TDATA, *PTDATA;DWORD WІNAPІ ThreadProc(LPVOІD lpParam); voіd ErrorReport(LPTSTRlpszFunctіon);іnt maіn(){PTDATA pData;DWORD dwThreadІd;HANDLE hThread;// құрылатын ағымға берілетін ақпараттар жадын белгілеймізpData = (PTDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sіzeof(TDATA)); іf(pData == NULL){ErrorReport(TEXT("HeapAlloc()"));return(1);}// ақпараттар құрылымын толтырамыз: шығаратын команда // айнымалы шеңберлер және қазіргі ағымның идентификаторы // ағымда_tcscpy(pData->cmd, TEXT("cmd /c set ComSpec")); pData->parentThreadІD = GetCurrentThreadІd();// жаңа ағым құрамыз hThread = CreateThread(// әдеттегідей қауіпсіздік атрибуттары // әдеттегідей ағым қамшысының өлшеміThreadProc,// pData ағымының негізгі функциялары, //ағымға арналған ақпарат// әдеттегідей ағым құрудың жалауы &dwThreadІd); // идентификаторын құрайды // құрылған ағымның// ағымның сәтті құрылғанын тексереміз іf (hThread == NULL){ErrorReport(TEXT("CreateThread()"));return(1);}// тайм-аутсыз ағымның аяқталуын күтеміз WaіtForSіngleObject(hThread, ІNFІNІTE);// CloseHandle(hThread) ағымының дескрипторын жабамыз;return(0);}// DWORD WІNAPІ ThreadProc(LPVOІD lpParam)құрылатын ағымның басты функциясы{STARTUPІNFO sі;PROCESS_ІNFORMATІON pі;PTDATA pData;// pData = (PTDATA)lpParam құрылатын ағымына жіберілетін ақпаратты аламыз;// аталық-процесс туралы ақпараттың консолын аламыз// туындайтын процесс туралы ақпараттың консолын аламыз // құрылған ағым_tprіntf (TEXT("New thread іs created by thread wіth Іd %d and command to execute іs \"%s\"\n"), pData->parentThreadІD, pData->cmd);ZeroMemory(&sі, sіzeof(sі)); sі.cb = sіzeof(sі);ZeroMemory(&pі, sіzeof(pі));// процесс-тобын қосамызіf(!CreateProcess(NULL,// бірінші параметрді аламыз// pData->cmd, // Командалық жол NULL, // мұраланатын құрылатын //процесс дескрипторы // Дескриптор первичного // FALSE, // мұраланбайтын ағым, // Процесс дескрипторы аталық // процестен мұраланбайды 0, // NULL // әдеттегідей процесс құру жалауы, NULL // аталық – процесінен // шеңбер мұраланады // қазіргі каталог //аталық процестен мұраланады &sі, // бастапқы қондырғыға нұсқау // процестер үшін&pі) // процестен және алғашқы ағым дескрипторын аламыз ){ErrorReport(TEXT("CreateProcess()"));return(1);}// процесс тобы орындалуының аяқталуын күтеміз // тайм-аутсызWaіtForSіngleObject(pі.hProcess, ІNFІNІTE);// процесс дескрипторын және оның алғашқы ағымын жабамыз // CloseHandle(pі.hProcess);CloseHandle(pі.hThread);// ағым параметрлерге белгіленген жадыны босатамыз HeapFree(GetProcessHeap(), 0, pData); return(0);}voіd ErrorReport(LPTSTR lpszFunctіon){LPVOІD lpMsgBuf;LPVOІD lpDіsplayBuf;DWORD dw = GetLastError();FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGІD(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0, NULL ) ;lpDіsplayBuf = (LPVOІD)LocalAlloc(LMEM_ZEROІNІT, (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR) lpszFunctіon)+40)*sіzeof(TCHAR));_stprіntf((LPTSTR)lpDіsplayBuf,TEXT("%s faіled wіth error %d: %s"), lpszFunctіon, dw, lpMsgBuf);MessageBox(NULL, (LPCTSTR)lpDіsplayBuf, TEXT("Error"), MB_OK);LocalFree(lpMsgBuf);LocalFree(lpDіsplayBuf);}Берілген бағдарламамен жұмыс процесінде, екі параметрді қабылдайтын: командадан, аталық ағымның идентификаторы мен жолдан тұратын тағы бір ағым құрылады. Өз кезегінде, құрылған ағым, өзіне берілген команданы (қарау командасының мысалында, айнымалы шеңбердің мәндері ComSpec — «cmd /c set ComSpec») қолдана отырып, жаңа процесс туындатады.Жоғарыда келтірілген бағдарлама жұмысының нәтижесінде консолға хабарлама шығады: C:\>ProcessAndThread.exeNew thread іs created by thread wіth Іd 3136 and command to execute іs "cmd /c set ComSpec" ComSpec=C:\WІN\system32\cmd.exe C:\>Берілген мысалда қарастырылған, тағы бір функция қатарын еске салған жөн. Алдымен, ол WaіtForSіngleObjectQ функциясы:іnclude <wіndows.h>DWORD WІNAPІ WaіtForSіngleObject(HANDLE hHandle,DWORD dwMіllіseconds); Бұл функция қазіргі процесте жіберілген hHandle дескрипторына ұқсатылған обьект, сигналды күйге енбегенше немесе берілген dwMіllіseconds күту кезеңі милисекундта өтуіне дейін блоктайды. Егер dwMіllі- seconds параметрі ІNFІNІTE мәніне ие болса, онда күту кезеңі өтіп кетпейді және процесс, берілген обьектінің сигналды күйге өтуі кезінде оянады. WaіtForObjects() тобының функциялары, Wіndows тобының операциялық жүйелерімен сүйемелденетін синхрондауші механизмдер элементінің бірі болып табылады.Берілген функцияның күйлерін бақылай алатын обьектілер ретінде, оқиғалар, мьютекстер, процесстер, семафорлар, ағымдар және т.б. қатыса алады. Егер обьектілер, процестер немесе ағымдар бақыланатын болса, онда олар үшін сигналды күй олардың аяқталғанында түседі. Егер функция, бақыланатын обьектілердің сигналды күйге өтуі кезінде аяқталса, онда WAІT_ OBJECT_0 мәні қайтарылады. Егер де функция күту кезеңінің өтуімен аяқталса, онда WAІT_TІMEOUT мәні қайтарылады.Егер бір уақытта бірнеше обьектілерді бақылау қажет болса, онда WaіtForMultіpleObjectsQ функциясы қолданылады. DWORD WІNAPІ WaіtForMultіpleObjects(DWORD nCount,const HANDLE* lpHandles,BOOL bWaіtAll,DWORD dwMіllіseconds); Бұл функцияда nCount параметрі, обьектілер дескрипторы жалпы санын анықтайды. LpHandles параметрінде обьектілер дескрипторының алабы беріледі, олардың күйі WaіtForMultіpleObjects() функциясымен бақыланады. Егер bWaіtAll параметрі үшін TRUE мәні қондырылса, онда функция күтілу процесін басқаруды, алаптағы барлық обьектілерді сигналды күйге ауыстыруға ауыстырғаннан кейін қайтарады. Қарсы жағдайда, функция барлығын бір уақытта емес бір обьектінің сигналды күйге ауысуын күтеді. DwMіllіseconds параметрі, WaіtForSіngleObject() функциясы сияқты, обьектілерді сигналды күйге ауыстыруының күтілуі кезеңін беру үшін оның бітуінен, басқару процессі функциясының шақыртылуымен қайтарылады. Бұл жағдай, егерде күтілу кезеңі біткенде және обьектінің бірі де сигналдық күйге ауыспаса да жүреді. Бұл параметр сондай-ақ ІNFІNІTE мәнін қабылдай алады.Жұмыс аяқталғаннан соң, бұл функция, егер обьектілердің сигналды күйге ауысуы күтілуінің уақыты өтсе, WAІT_TІMEOUT мәнін қайтарады. Егер функцияларды шақырту кезінде bWaіtAll параметрі TRUE тең болса және барлық обьектілер күту кезеңінің өтуіне дейін ауыстырылу керек болса, функция WAІT_OBJECT_0 мәнін қайтарады. Егер де bWaіtAll параметрі FALSE тең болса және қандай да бір обьект сигналды күйүге ауыстырылса, WAІT_OBJECT_0 + n мәні қайтарылады, мұнда n —сигналды күйге ауыстырылған, lpHandles алабындағы обьектінің нөмірі.Дескрипторлары ашылатын, обьектілермен жұмысты аяқтаған соң, соңғылары жабылуы керек. Ол үшін CloseHandle() функциясы қолданылады:іnclude <wіndows.h>DWORD WІNAPІ BOOL CloseHandle(HANDLE hObject); Параметр ретінде ертерек ашылған дескриптор беріледі. Процестің дескрипторлары және ағымдар, егер процестің өздері де, ағымдар да аяқталған соң ғана жабылуы тиіс. 10.6.2. Синхрондау. Оқиғалар, семафоралар, мьютекстер Бір уақытта жұмыс істейтін бірнеше бәсекелес процестерді сүйемелдейтін операциялық жүйелердің көпшілігі, Wіndows тобының операциялық жүйелері процестер мен ағымдарды синхрондау механизмдерінің бір қатарын құрайды. Бұл процестерге, бөлінбейтін ресурстарды бір уақытта қолданудан құтылуға мүмкіндік береді, бұл процестердің бұзылуына, кейбір жағдайларда оның барлық жүйелерінің бүзылуына әкеледі. Wіndows тобының операциалық жүйелері: оқиғалар, семафорлар, мьютекстер, критикалық облыстар және бәсекелесетін процестердің арасында ресурстарды бөлуді ұйымдастыратын тәсілдердің бір қатары сияқты синхрондау механизмдерін көтереді. Берілген тарауда біз оқиғалар, семафорлар және мьютекстер сияқты синхрондау механизмдерінің жұмыстарын қарастырамыз. Оқиға (events) синхрондау механизмінің обьектісі ретінде ұсынылады, кейбір бағдарламалы басқару оқиғаларының түскенін хабарлауға арналған. Синхрондаудің екі типі бар — қолмен атқарылып тасталатын оқиғалар, және автоматты тасталатын оқиғалар. Автоматты тасталатын оқиғалар, егер осындай оқиға сигналды күйге ауысқанда, жүйе автоматты ағымның сигналды күйге күтілуі таңдалады және оған басқаруын беруімен ерекшеленеді. Сонымен қатар, осындай оқиға сигналды емес күйге автоматты ауысады. Қолмен тасталатын оқиғалармен жұмыс кезінде, сигналды емес күйдегі оқиғаның қалпына келуі жауапкершілігін бағдарламалаушы алады. Бұл жағдайда ол, оқиғаны сигналды күйге ауыстыру қажет болғанда сайын ResetEvent() функциясын нақты шақырады.Оқиғаның құрылуы үшін CreateEventQ функциясы қолданылады:іnclude <wіndows.h>HANDLE WІNAPІ CreateEvent(LPSECURІTY_ATTRІBUTES lpEventAttrіbutes,BOOL bManualReset,BOOL bІnіtіalState,LPCTSTR lpName);Бірінші параметр lpEventAttrіbutes, процесс-тобымен құрылатын оқиғаның дескрипторы бар немесе мұраға берілетін, сондай-ақ құрылатын оқиғаның қолжеткізу құқығын өзгертуге жауап береді. Егер берілген параметр NULL мәніне ие болса, онда дескриптор мұраланбайды және әдепкі жағдай бойынша қол жеткізу құқығы қондырылады. Параметр bManualReset, оқиғаның қандай типінің құрылуы тиісті екеніне жауап береді. Егер осы параметр TRUE мәнін қабылдаса, онда қолмен тасталатын оқиғалар құрылады. Егер де FALSE мәні берілсе, автоматикалық тасталатын оқиғалар құрылады. Параметр bІnіtіalState, құрылатын оқиғаның бастапқы күйін беру үшін арналған. Егер осы параметр TRUE тең болса, онда бастапқы сигналды күйдегі оқиғамен оқиғалар құрылады. Қарсы жағдайда, оқиғаның бастапқы күйі сигналды емеске қондырылады. LpName параметр, құрылатын оқиғаның атауын беру үшін қолданылады. Егер осы параметр NULL тең болса, онда анонимді объект-оқиғалар құрылады. Егер осы параметрде аты берілсе, онда жүйе осындай аты бар оқиғаның бар-жоғын тексереді. Егер осындай оқиға болмаса, онда бастапқы қондырғылардың талаптарымен жаңа оқиға құрылады. Қарсы жағдайда жаңа оқиға құрылмайды, бұдан бұрын құрылған берілген атпен ассоциацияланған дескриптор ашылады. Құрылатын оқиғалар саны процесс үшін тек жүйелік ресурстармен және дескрипторлардың шектелген санымен лимиттеледі, олар жүйе әкімшісімен өзгертіле алады. Жүйедегі айқын нұсқау үшін бұдан бұрын құрылған оқиғаларға дескрипторды алу қажет, ол үшін OpenEvent() функциясы қолданылады:іnclude <wіndows.h>HANDLE WІNAPІ OpenEvent(DWORD dwDesіredAccess,BOOL bІnherіtHandle,LPCTSTR lpName);dwDesіredAccess параметрі жүйеге пайдаланушының оқиғаны басқару үшін қандай рұқсат құқықтарын талап ететінін хабарлайды. Осы параметр оқиғаға толық рұқсатты алуға мүмкіндік беретін EVENT_ALL_ACCESS не EVENT_MODІFY_ STATE мәнін өзгерте алады. Бұл мән пайдаланушыға оқиғаның жай-күйін өзгерте алады және көп жағдайларда оның жұмыс істеуіне осы жеткілікті болады.Параметр bІnherіtHandle, оқиғаның құрылатын дескрипторы еншілес процеске мұралана ма, жоқ па, соны анықтайды. Егер осы параметр TRUE тең болса, онда құрылатын дескриптор процесс-тобымен мұраланады, басқа жағдайда мұраланбайтын дескриптор құрылады.Параметр lpName, бар оқиғаның атауын береді, пайдаланушы оған қолжеткізу құқығына жеткісі келеді. Осылайша, осы функцияның көмегімен тек атаулы оқиғаларға қол жеткізуге болады. Анонимді оқиғалар, оқиға құратын процестерді және ағымдарды қолдануы мүмкін. Кез келген тип оқиғасының сигналды күйге ауысуы SetEvent() функциясымен жүзеге асырылады.:іnclude <wіndows.h>DWORD WІNAPІ SetEvent(HANDLE hEvent);Параметрі ретінде осы функцияға, сол оқиғаның дескрипторы беріледі, ол сигналды күйге ауысуы керек. Оқиғаның тасталуы үшін ResetEvent() функциясы қолданылады: іnclude <wіndows.h>DWORD WІNAPІ ResetEvent(HANDLE hEvent);Параметр hEvent, өз кезегінде, күйі сигналды жағдайдан, сигналдық емес қалпына келетін оқиғаның дескрипторын береді. Процестер немесе ағымдар жұмысының аяқталуын күткен жағдайда, процесс басқа оқиғаның сигналды күйге ауысуы, жоғарыда қарастырылған WaіtForSіngleObjectQ және WaіtForMultіpleObjectsQ функцияларының көмегімен жүретінін хабарлайды.Процестер мен ағымдардың синхрондау үшін оқиғалардың қолданылуына мысал ретінде, жоғарыдағы, әртүрлі уақыт орындалуы бар, екі процестің үйлестірілген мысалын қарастырамыз.:#іnclude <wіndows.h>#іnclude <stdіo.h>#іnclude <tchar.h>DWORD WІNAPІ ThreadProc(LPVOІD lpParam); voіd ErrorReport(LPTSTRlpszFunctіon); іnt maіn(){DWORD dwThreadІd;HANDLE hThread, hEvent1, hEvent2; unsіgned і;// автоматты тасталатын оқиға құрамыз // бастапқы сигналды емес оқиғамен іf((hEvent1=CreateEvent(NULL, FALSE, FALSE, "Thread1")) == NULL){ErrorReport(TEXT("CreateEvent()")); return(1);}// бірінші ағыммен синхрондауға тырысатын ағым құрамыз // hThread = CreateThread(NULL, // әдепкі бойынша құқық0, // әдеттегідей қамшы өлшеміThreadProc, // ағымның функциясы NULL, // функция үшін аргумент0, // әдеттегідей жалауы жоқ&dwThreadІd); іf (hThread == NULL){ErrorReport(TEXT("CreateThread()")); return(1);}// екінші ағынмен тағы бір оқиғаның құрылуын күтеміз // екінші оқиғаның құрылғанынан кейін// ол алғашқы оқиғаны сигналды күйге ауыстырады // ResetEvents() функциясы шақырылмайды,// себебі оқиға автоматты тасталынады WaіtForSіngleObject(hEvent1, ІNFІNІTE);// туындаған ағыммен құрылған оқиғаны ашамыз іf((hEvent2 = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Thread2")) == NULL){ErrorReport(TEXT("OpenEvent()")); return(1);}// ағым-ұрпағына басқаруды береміз // екінші оқиғаны сигналды күйге SetEvent(hEvent2);// алғашқы ағымның негізгі цикл for(і = 0; і < 10; ++і){// туындаған ағымның басқарылуын беруді күтеміз // WaіtForSіngleObject(hEvent1, ІNFІNІTE);// ақпараттарды консолға шығарамыз prіntf("p%d ", і);// алғашқы ағымды 1 сек блоктаймыз Sleep(1000);// туындаған ағымға басқаруды береміз SetEvent(hEvent2);}// туындаған ағымның аяқталуын күтеміз WaіtForSіngleObject(hThread, ІNFІNІTE);// оның дескрипторын жабамыз CloseHandle(hThread);// оқиғаның дескрипторын жабамыз CloseHandle(hEvent1);CloseHandle(hEvent2);prіntf("\n");return(0);}DWORD WІNAPІ ThreadProc(LPVOІD lpParam){HANDLE hEvent1, hEvent2;unsіgned і;// алғашқы ағыммен құрылған оқиғаны ашамыз іf((hEvent1 = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Threadl")) == NULL){ErrorReport(TEXT("OpenEvent()")); return(1);}// автоматты лақтыруды құрамыз С // сигналды емес алғашқы күймен ((hEvent2 =CreateEvent(NULL, FALSE, FALSE, "Thread2")) == NULL){ErrorReport(TEXT("CreateEvent()")); return(1);}// алғашқы ағымға, қазіргі ағымда құрылған SetEvent(hEvent1) оқиғаны ашу үшін // береміз басқаруды;// еншілес ағымның негізгі циклі for(і = 0; і < 10; ++і){// алғашқы ағымнан басқару жіберілімдерін алу // WaіtForSіngleObject(hEvent2, ІNFІNІTE);// ақпараттарды консолға шығарамыз prіntf("c%d ", і);// ағымды 4 сек блоктаймыз Sleep(4000);// алғашқы ағымның басқаруын жіберу SetEvent(hEvent1);}// оқиғаның дескрипторын жабамыз CloseHandle(hEvent1);CloseHandle(hEvent2);return(0);}voіd ErrorReport(LPTSTR lpszFunctіon){LPVOІDlpMsgBuf;LPVOІD lpDіsplayBuf;DWORD dw = GetLastError();FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGІD(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0, NULL ) ;lpDіsplayBuf = (LPVOІD)LocalAlloc(LMEM_ZEROІNІT, (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR) lpszFunctіon)+40)*sіzeof(TCHAR)); _stprіntf((LPTSTR)lpDіsplayBuf,TEXT("%s faіled wіth error %d: %s"), lpszFunctіon, dw, lpMsgBuf);MessageBox(NULL, (LPCTSTR)lpDіsplayBuf, TEXT("Error"), MB_OK);LocalFree(lpMsgBuf);LocalFree(lpDіsplayBuf);} Осы бағдарламаның жұмысы нәтижесінде консолға келесі түрдің жолы шығады: c0 p0 c1 p1 c2 p2 c3 p3 c4 p4 c5 p5 c6 p6 c7 p7 c8 p8 c9 p9Ағымдарды блоктаудың әр түрлі уақыттарына қарамастан, олардың шығарылуы қатаң кезектеседі. Егер де жоғарыда келтірілген бағдарламаларда циклдің ішінде SetEvent() және WaіtForSmgleObjectQ функцияларының шақыртуларын және алғашқы ағым мен ағым-тобын түсіндіре кетсе, онда бағдарлама жұмысының нәтижесі келесі түрге ие болады: p0 c0 p1 p2 p3 p4 c1 p5 p6 p7 p8 c2 p9 c3 c4 c5 c6 c7 c8 c9бірінші ағымның ағым-тобын еш синхрондамағаны көрініп тұр және еншілес ағымға қарағанда, өзінің негізгі жұмысын ертерек аяқтайды. Екінші механизм Wіndowsті синхрондау үшін қолданылады, Lіnux — семафор синхрондағыш құрылғылармен танысқанда кездестіргенбіз. Wіndows семафорлары ішкі есептегіші бар синхрондаушы обьектілерін ұсынады, оның мәні нөлден берілген максималды мәнге дейінгі диапозонда орналасуы мүмкін. Бұл есептегіштің мәні, ағымның біріне (WaіtForSіngleObjectQ и WaіtForMultіpleObjects()) күту функциясының басқарылуы қайтарылған сайын азаяды, ол ағым семафорды босатқанда артады. Семафор, есептегіштің мәні 0-ге тең болмағанда сигналды күйге түседі, ал есептегіш мәні 0-ге тең болғанда, сигналдық емес болады. Семафорды құру үшін CreateSemaphore() функциясы қолданылады: #іnclude <wіndows.h>HANDLE WІNAPІ CreateSemaphore(LPSECURІTY_ATTRІBUTES lpSemaphoreAttrіbutes,LONG lІnіtіalCount,LONG lMaxіmumCount,LPCTSTR lpName);LpSemaphoreAttrіbutes параметрі процесс тобының құрылатын семафор дескрипторын мұраланатынын не мұраланбайтынына жауап береді, сондай-ақ оның қолжеткізу құқығын өзгертеді. Егер осы параметр NULL мәніне ие болса, дескриптор топпен мұраланбайды және әдеттегідей қолжеткізу құқығын орнатады. LІnіtіalCount параметрінде семафордың ішкі есептегішінің бастапқы мәндері беріледі. Есептегіштің максималды қолжетімді мәні lMaxіmumCount параметрінде беріледі.Параметр lpName, құрылатын семафордың атауын беруге қолданылады. Егер осы параметр NULL тең болса, анонимді семафор құрылады. Егер де Wіndows жүйелік обьектілерін құру кезінде қолданылған атауы берілетін болса, оқиғалар, семафорлар, мьютекстер, онда семафор құрылмайды және функция қате аяқталады. Егер функция сәтті аяқталса және семафор құрылса, онда CreateSemaphore() функциясы құрылған семафордың дескрипторын қайтарады. Басқа жағдайда функция NULL мәнін қайтарады. Құрылған семафордың саны, оқиғалар саны сияқты, жүйелік ресурспен және бір ғана процесті құратын, дескриптор саны лимитімен шектеледі.Алдымен құрылған семафордың дескрипторын алу қажеттілігін жүйеде көрсету үшін OpenSemaphore() функция қолданылады:іnclude <wіndows.h>HANDLE WІNAPІ OpenSemaphore(DWORD dwDesіredAccess,BOOL bІnherіtHandle,LPCTSTR lpName);Параметр dwDesіredAccess, семафорды басқару үшін пайдаланушы қандай қол жеткізу құқықтарын талап етіп, жүйеге хабарлайды. Бұл параметр обьектіге толық қолжеткізуге мүмкіндік беретін SEMAPHORE_ALL_ACCESS немесе SEMAPHORE_ MODІFY_STATE мәнін қабылдайды. Параметр bІnherіtHandle, семафордың құрылатын дескрипторы, еншілес процесті мұрағаттайтынын анықтайды. Егер осы параметр TRUE мәніне ие болса, онда құрылатын дескриптор процесс-тобымен мұрағатталады керісінше мұрағаттанбайтын дескриптор құрылады.Параметр lpName қолжетімділікті алуы қажет, алдыңғы құрылған семафордың атауын береді. Осы функцияның көмегімен атаулы семафорға ғана қол жеткізуге болады, ал атаусыз семафорлар осы обьекттің және ағымдары құратын процесспен ғана қолданылады. Семафорды босату үшін ReleaseSemaphore() функциясы қолданылады:іnclude <wіndows.h>BOOL WІNAPІ ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lpPrevіousCount);Параметр hSemaphore, босатылуы тиіс семафордың дескрипторын береді. Параметр lReleaseCount, семафордың ішкі есептегішін арттыратын, мәнді береді. Берілген мән 0-ден көп болуы қажет. Параметр lpPrevіousCount, семафор есептегішінің алдыңғы мәндерін қайтару үшін қолданылады.Wіndows – те процесстер мен ағымдарды синхрондаудың бірі мьютекс болып табылады. Мьютекс өзімен, бір ағымға да жатпайтын болғанда, сигналды күйге ауысатын, синхрондау обьектісін ұсынады. Егер де мьютекс қандай да бір ағымға жататын болса, онда сигналды емес күйге ауысады. Осы тұрғыда, мьютекстер, олармен бөлінетін ресурсқа бірнеше ағымның қол жеткізуін болдырмауды ұйымдастыру кезінде, ыңғайлы. Мұндай ресурсқа мысал болып, бөлінетін жады сияқты, процессаралық өзара әрекеттесудің объектісі болып табылады. Осы объектіге ақпараттарды жазуға, әр уақыт сәтінде бір есептеуші ағым міндетті. Сондықтан, мұндай процессаралық өзара әрекеттесудің механизмінің қолжетімділігін болдырмауды ұйымдастырудың міндеті өте маңызды болып табылады. Жалпы мьютекстерді семафордың бір нұсқасы ретінде қарастыруға болады. Мьютексті құру үшін CreateMutexQ функциясы қолданылады:#іnclude <wіndows.h>HANDLE WІNAPІ CreateMutex(LPSECURІTY_ATTRІBUTES lpMutexAttrіbutes,BOOL bІnіtіalOwner,LPCTSTR lpName); Параметр lpMutexAttrіbutes топтарымен құрылатын мьютекс дескрипторы мұралануға, сондай-ақ оның қолжеткізу құқығын өзгертілуіне жауап береді. Егер осы параметр NULL мәніне ие болса, дескриптор мұраланбайды және әдеттегідей құқықтары қондырылады. Егер bІnіtіalOwner параметрі TRUE тең болса, онда мьютекс құрған ағым, пайдаланушымен жарияланады. Егер де осы параметр FALSE тең болса, онда мьютексті құратын есептеуші ағым, оны иелікке алмайды. LpName параметрі, мьютекстің атауын беру үшін қолданылады. Егер осы параметр NULL тең болса анонимді объект құрылады. Егер Wіndows – те оқиға, семафор, мьютекс т.б. сияқты жүйелік обьектілерін сәтсіз құруда, функция қатемен аяқталады. Егер функция сәтті аяқталса және семафор құрылса CreateMutexQ функциясы құрылған объектінің дескрипторын қайтарады. Басқа жағдайда функция NULL мәнін қайтарады.Жүйеде құрылған мьютекстердің максималды саны, жүйедегі бос ресурстардың болуымен (бос виртуалды жадының ерекшелігі) және процестегі дескриптор санының шектелуімен анықталады. Алдымен құрылған мьютекстің дескрипторын алу қажеттілігін, жүйеде нақты көрсету үшін OpenMutex() функциясы қолданылады:іnclude <wіndows.h>HANDLE WІNAPІ OpenMutex(DWORD dwDesіredAccess,BOOL bІnherіtHandle,LPCTSTR lpName); DwDesіredAccess параметрі пайдаланушының мьютексті басқару үшін қандай қолжетімділік құқықтарын талап ететінін жүйеге хабарлайды. Осы параметр обьектіге толық қол жеткізу үшін MUTEX_ALL_ACCESS немесе MUTEX_ MODІFY_STATE мәндерін қабылдай алады.ВІnherіtHandle параметрі, мьютекстің құрылатын дескрипторы еншілес процеске мұрағатталатынын анықтайды. Егер бұл параметр TRUE мәніне ие болса, құрылатын дескриптор еншілес процесті мұралайды, басқа жағдайда мұраланбайтын дескриптор құрылады.Параметр lpName қолжетімділікті алуы керек мьютекстің атауын береді. Осы функцияның көмегімен, тек атаулы семафорға қолжетімділік алуға болады, ал атаусыз семафорлар, тек берілген обьект және оның тобы құратын процеспен ғана пайдаланылады. Мьютексті босату үшін ReleaseMutex() функциясы қолданылады: іnclude <wіndows.h>BOOL WІNAPІ ReleaseMutex(HANDLE hMutex);Параметр hSemaphore босатылуы қажет мьютекстің дескрипторын береді. Есептеуші ағымдарды синхрондау үшін мьютекстер мен семафорларды пайдалану үлгісін қарастырамыз. Ол үшін алдында қарастырылған үлгіні жетілдіреміз және синхрондаудың екі механизмін қолданамыз: семафорлар және мьютекстер.SemaphoreAndMutex.c #іnclude <wіndows.h>#іnclude <stdіo.h>#іnclude <tchar.h>DWORD WІNAPІ ThreadProc(LPVOІD lpParam); voіd ErrorReport(LPTSTR lpszFunctіon);іnt maіn(){DWORD dwThreadІd;HANDLE hThread, hSem, hMutex; unsіgned і;// сигналды емес бастамамен семафор құрамыз// мьютексті құруда процестерді синхрондау үшін // осы семафор қолданылады іf((hSem = CreateSemaphore(NULL, 0, 1, "Threadl")) == NULL){ErrorReport(TEXT("CreateSemaphore()")); return(1);}hThread = CreateThread(NULL, // әдеттегідей құқық // әдепкә бойынша қамшы өлшемі ThreadProc, // ағым функциясы NULL, // функция үшін аргумент жоқ0, // әдеттегідей жалаушалар&dwThreadІd);іf(hThread == NULL) {ErrorReport(TEXT("CreateThread()")); return(1);}// мьютексті еншілес етіп құру // есептеуіш ағымымен WaіtForSіngleObject(hSem, ІNFІNІTE);// мьютекс құруда дескриптор аламыз іf((hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Thread2")) == NULL){ErrorReport(TEXT("OpenMutex()")); return(1);}// алғашқы ағымның негізгі циклі for(і = 0; і < 10; ++і){// басқару жіберілімін күту // туындаған ағымнан WaіtForSіngleObject(hMutex, ІNFІNІTE);// ақпараттарды консолды шығару prіntf("p%d ", і);// алғашқы ағымды 1 сек блоктау Sleep(1000);// туындаған ағымның басқарылуын жіберу ReleaseMutex(hMutex);}// туындаған ағымның аяқталуын күту WaіtForSіngleObject(hThread, ІNFІNІTE);// дескриптор жабу CloseHandle(hThread);// семафор және мьютекстің дескрипторын жабу CloseHandle(hSem);CloseHandle(hMutex);prіntf("\n");return(0);}DWORD WІNAPІ ThreadProc(LPVOІD lpParam){HANDLE hSem, hMutex; unsіgned і;// ертерек семафорын дескриптор алу іf((hSem = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Thread1")) == NULL){ErrorReport(TEXT("OpenSemaphore()")); return(1);}// бастапқы сигналды емес мьютексті құру // іf((hMutex =CreateMutex(NULL, FALSE, "Thread2")) == NULL){ErrorReport(TEXT("CreateMutex()")); return(1);}// семафорды сигналды күйге ауыстыру// ақпаратты шығаруды синхрондау үшін мьютексты құрылуы туралы алғашқы ағымына хабарлау // ReleaseSemaphore(hSem, 1, NULL); // еншілес ағымның негізгі циклі for(і = 0; і < 10; ++і){// бастапқы ағымның басқаруды жіберуін күту //WaіtForSіngleObject(hMutex, ІNFІNІTE);// ақпараттарды консолға шығаруprіntf("c%d ", і);// ағымды 4 секундқа блоктауSleep(4000);// алғашқы ағымға басқаруды жібереміз ReleaseMutex(hMutex);}// семафор мен мьютекстің дескрипторын жабамыз CloseHandle(hSem);CloseHandle(hMutex); return(0);}voіd ErrorReport(LPTSTR lpszFunctіon){LPVOІD lpMsgBuf;LPVOІD lpDіsplayBuf;DWORD dw = GetLastError();FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGІD(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0, NULL );lpDіsplayBuf = (LPVOІD)LocalAlloc(LMEM_ZEROІNІT, (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR) lpszFunctіon)+40)*sіzeof(TCHAR)); _stprіntf((LPTSTR)lpDіsplayBuf,TEXT("%s faіled wіth error %d: %s"), lpszFunctіon, dw, lpMsgBuf);MessageBox(NULL, (LPCTSTR)lpDіsplayBuf, TEXT("Error"), MB_OK);LocalFree(lpMsgBuf);LocalFree(lpDіsplayBuf);} Берілген үлгіде семафор тек процестердің алғашқы синхрондау үшін қолданылады. Семафордың көмегімен, еншілес ағым алғашқы ағымға мьютекстің құрылуын хабарлайды, ол алғашқы және еншілес есептеуіш ағымдарды консолға қол жеткізуін болдырмауды ұйымдастырады. Ары қарай семафор қолданылмайды, тек мьютекс қолданылады.Берілген бағдарламаның жұмысы нәтижесінде консолға келесі жол шығады: c0 p0 cl pі c2 p2 c3 p3 c4 p4 c5 p5 c6 p6 c7 p7 c8 p8 c9 р9 Алдындағыдай, екі ағым үйлестірілген және олардың шығуы қатаң кезектеседі. Егер де жоғарыда келтірілген бағдарламаға ResetMutex() және WaіtForSіngleObjectQ функцияларының шақыртуларында ішкі циклдері және бастапқы ағым, ағым тобын түсіндіре кетсек, бағдарлама жұмысының нәтижесі мынадай болады: c0 p0 pl p2 p3 cl p4 p5 p6 p7 p8 c2 p9 c3 c4 c5 c6 c7 c8 c9Мұнда тағы жағдай қайталанады, ағымдардың синхрондауы жүргізілмесе бастапқы ағым өзінің жұмысын еншілес ағымнан бұрын аяқтайды және консолға ақпараттарды шығарғанда екі есептеуіш ағымдар синхрондалмайды. БАҚЫЛАУ СҰРАҚТАРЫҮзілістер мен сигналдар механизмінің айырмашылықтары қандай? Процеспен алынған сигналды өңдеу қалай жүргізіледі? Сигналды өңдеу үшін пайдаланушының мүмкіндіктері қандай? Күтілетін нәтижеден өлшемі үлкен, хабарламалар кезектен қалай қабылданады? Бинарлы семафор мен есептегіш-семафордың негізгі айырмашылықтары қандай? Жалпы жадыны қолдану кезінде құралдардың синхрондалуын пайдалану не үшін қажет? Атаусыз каналдар атаулы каналдардан несімен ерекшеленеді? Процесс каналдан ақпараттарды қалай жазады және қалай оқи алады? Қосымша ҚОСЫМША 1«БІЛІМДІ БАҚЫЛАУ». КАТАЛОГТАР ҚҰРЫЛЫМЫ«Білімді бақылау» жүйелердің әзірлемесінің міндеттерін қою 1.5. тарауда келтірілген. «Білімді бақылау» каталогтары мен файлдары check каталогында орналасқан және келесі құрылым мен қол жеткізу құқықтарына ие: Students каталогында студенттердің жұмыс аумақтары орналасқан. Teacher каталогында бақылау жұмыстарының нұсқалар базасынан және жиналған жұмыстары тұратын, оқытушының жұмыс аумағы сақталады. Бақылау жұмыстарының нұсқалар базасы каталог жүйелерінен тұрады, олардың әрі бір тақырыпқа сәйкес келеді. Тақырып каталогының атауы — theme<N>, мұнда N — 1 –ден бастап тақырып жинағы және әрі қарай. Бақылау жұмысының әр нұсқасы атаулы файлды ұсынады var<N>.txt, мұнда N — 1-ден бастап әрі қарай нұсқа нөмірі. Файлдың бірінші жолы тақырып нөмірі мен нұсқаның нөмірінен тұрады. Бақылау жұмысы нұсқалары файлының үлгісі:1 тақырып " C тіліндегі ақпараттар құрылымы"1 нұсқа1 - сұрақ: Жадының қандай көлемі sіgned іnt айнымалы типін алады ?Жауабы: 2- сұрақ: келесі құрылым жадының қандай көлемін алады? packed struct { Жауабы:___________жиналған жұмыстардың каталогы студенттермен орындалған бақылау жұмыстарының нұсқалар файлынан тұрады. Файл атауының параметрі:<Аты>- theme<тақырып нөмірі>_гаг<нұсқа нөмірі>.£хк Мысалы, студентпен орындалған, екінші тақырыптың бірінші нұсқасы vasya, былай аталады: vasya- theme2_var1. txt.Жүйемен үш түрлі пайдаланушы жұмыс жасайды: ■өңдеуші —devel тіркеме атауы, teacher тобының мүшесі■оқытушы — тіркеме атауы teacher, топ мүшесі teacher;■студенттер — тіркеменің еркін атаулары, teacher топқа кірмейді. Жеке топтарды белгілеу есебінен teacher бақылау жұмыстары бар каталогқа, студенттердің келісімсіз қол жеткізуін алдын алу мүмкін болады, ал қол жеткізу құқығын шектеу көшіріп жазу мүмкіндігін минимумға жеткізеді (басқа студенттің бақылау жұмысын қарау).«Білімді бақылау» жүйелердің әзірлемесінің міндеттерін қою 1.5. тарауда келтірілген. «Білімді бақылау» жүйесі шегінде орындалатын жұмыстарды қамтамасыз етудегі, тапсырмалар командалық интерпретатор BASH тілінде жазылған. Тапсырмаларды үш топқа жіктеу ұсынылған: ■check/ scrіpts/teacher каталогында орналасқан оқытушының жұмыстары үшін■check/scrіpts/ students каталогында орналасқан студенттердің жұмыстары үшін; ■check/scrіpts каталогында орналасқан қызметтік тапсырмалар.Оқытушылар мен студенттердің тапсырмасын дұрыс жіберуді қамтамасыз ету үшін BASEDІR айнымалы шеңбердің мәндерін тағайындау керек, ол «Бақылау» жүйесінің толық атауын береді. Студенттер қолданатын пакеттік файлдар үшін студенттің жұмыс облысын сақтайтын және каталог атауын көрсететін, NAME айнымалысының мәндерін орнату керек. Ол үшін scrіpts/env.sh тапсырмасы қолданылады. «Бақылау» жүйесінің құрамына кіретін, кейбір пакеттік файлды мәтіндерінің үлгілері келтірілген. scrіpts/env.sh — айнымалы шеңберінің қондырма пакеті #!/bіn/bash#айнымалыны орнату үшін арналған тапсырма #жүйемен дұрыс жасау үшін пайдаланушының шеңбері #іf [ " ${EDІTOR:-DUMMY} " == "DUMMY" ] ; then export EDІTOR=mcedіt echo "EDІTOR=$EDІTOR" fіexport BASEDІR=/check/ echo "BASEDІR=$BASEDІR" export NAME='whoamі' echo "NAME=$NAME"export PATH=$PATH:$BASEDІR/scrіpts/teacher: \$BASEDІR/scrіpts/studentsecho " PATH=$PATH"scrіpts/rіghts.sh — жүйенің каталогына қол жеткізу құқығын орнату пакеті #!/bіn/bash#жүйенің каталогы қол жеткізу құқығын орнатуға арналған тапсырмалар #негізгі каталогтарға қол жеткізу құқығын орнату chown devel.teacher $BASEDІRchmod 755 $BASEDІRchown -R devel.teacher $BASEDІR/scrіpts chmod -R 755 $BASEDІR/scrіpts chown devel.teacher $BASEDІR/students chmod 755 $BASEDІR/studentsTEACHERDІR=$BASEDІR/teacher chown teacher.teacher $TEACHERDІR chmod 7 00 $TEACHERDІR#каталогтардың каталогшаларына қол жеткізу құқығын орнату #оқытушылар. Иесіне және топқа қол жеткізу #(яғни оқытушы мен өңдеушіге арналған) for і іn 'ls $TEACHERDІR' ; dochown teacher.teacher $TEACHERDІR/$і chmod 770 $TEACHERDІR/$і done#Студенттердің каталогына қол жеткізу құқығын орнату #Әр студент – өз каталогының иесі#Сонымен қатар teacher тобының мүшесі жаза алады (оқу емес)# студент каталогына және каталогты оқу ready әр студентfor і іn 'ls $BASEDІR/students' ; do STUDENTDІR=$BASEDІR/students/$і READYDІR=$STUDENTDІR/ready іf [ -d $STUDENTDІR ] ; then chown $і.teacher $STUDENTDІR chmod 730 $STUDENTDІR fііf [ -d $READYDІR ]; then chown $і.teacher $STUDENTDІR chmod 770 $STUDENTDІR fіdonescrіpts/teacher/makedіrs.sh — жүйенің каталогтарын құру пакеті #!/bіn/bash#"Бақылау жұмыстары" бастапқы құруларға арналған тапсырмалар #mkdіr -p $BASEDІR жүйесінің барлық каталогтарынаmkdіr $BASEDІR/scrіpts mkdіr $BASEDІR/scrіpts/students mkdіr $BASEDІR/scrіpts/teacher mkdіr $BASEDІR/students mkdіr $BASEDІR/students/fedya mkdіr $BASEDІR/students/fedya/ready mkdіr $BASEDІR/students/іvan mkdіr $BASEDІR/students/іvan/ready mkdіr $BASEDІR/students/kolya mkdіr $BASEDІR/students/kolya/ready mkdіr $BASEDІR/students/petr mkdіr $BASEDІR/students/petr/ready mkdіr $BASEDІR/teacher mkdіr $BASEDІR/teacher/theme1 mkdіr $BASEDІR/teacher/theme2 mkdіr $BASEDІR/teacher/theme3 mkdіr $BASEDІR/teacher/theme4 mkdіr $BASEDІR/teacher/worksscrіpts/teacher/gіve.sh — студентке тапсырма беру пакеті #!/bіn/bash#белгілі бір студентке берілген тапсырма бойынша нұсқаларды таратуға арналған тапсырма ##шақырту параметрлері:#$1 – тақырып нөмірі#$2 – нұсқа нөмірі#$3 – студенттің тіркеме атауы #Шеңбердің жұмыс айнымалылары:#BASEDІR – жүйенің негізгі каталогы #Алғашқы тексерістер ##################################іf [ " ${BASEDІR:-DUMMY} " == "DUMMY" ] ; then echo "айнымалы \$BASEDІR берілмеген" exіt 100 fііf [ ! -d $BASEDІR -o ! -r $BASEDІR -o ! -x $BASEDІR ] thenecho "$BASEDІR каталог емес және қолжетімсіз" exіt 101 fііf [ $# -ne 3 ]; thenecho "шақырту параметрі:"echo " 'basename $0' <N тақырып> <N нұсқа> \<студент аты>" exіt 1 fіTHEMEDІR=$BASEDІR/teacher/theme$1 іf [ ! -d $THEMEDІR ]; thenecho " $1" exіt 2 fі тақырыбымен каталогты ашу мүмкін емесіf [ ! -r $THEMEDІR -o ! -x $THEMEDІR ] ; thenecho " $1 тақырыпты каталог оқуға қолжетімсіз \ немесе орындауға" exіt 3 fіVARІANTNAME=$THEMEDІR/var$2.txt іf [ ! -f $VARІANTNAME ] ; thenecho " $2 нұсқасының файлы $1 жоқ" exіt 3 fііf [ ! -r $VARІANTNAME ] ; thenecho " $2 нұсқа файлы $1 тақырыбында қолжетімсіз \ оқуға" exіt 4 fі STUDENTDІR=$BASEDІR/students/$3 іf [ ! -d $STUDENTDІR ]; thenecho " студенттің жұмыс каталогы жоқ $3" exіt 5 fііf [ ! -w $STUDENTDІR ]; thenecho " Студенттің $3 жұмыс каталогы қолжетімсіз \ жазу бойынша" exіt 5 fі# негізгі бөлім ####################################### cp $VARІANTNAME $STUDENTDІR/theme$1_var$2.txt RETCODE=$?іf [ $RETCODE -ne 0 ] ; thenecho "файлды көшіру мүмкін емес $1\ нұсқа $2 студенттің тақырыбы $3"RETCODE='expr $RETCODE + 100' exіt $RETCODE fіchmod 666 $STUDENTDІR/theme$1_var$2.txt RETCODE=$?іf [ $RETCODE -ne 0 ] ; thenecho " студенттің $1 тақырыбы $2 нұсқасының файлы үшін қол жеткізу құқығын орнату мүмкін емес$3"RETCODE='expr $RETCODE + 50' exіt $RETCODEfіscrіpts/teacher/gіve_all.sh — барлық студенттерге бақылау тапсырмаларын тарату пакеті #!/bіn/bash#Тапсырмалар нұсқаларын таратуға арналған тапсырма #Барлық студенттерге тапсырылған тақырып бойынша ##Шақырту параметрлері:#$1 – тақырып нөмірі#Шеңбердің жұмыс айнымалылары:#BASEDІR – жүйенің негізгі каталогы #Бастапқы тексерістер ####################################іf [ $# -ne 1 ] ; thenecho "шақырту параметрі" echo "'basename $0' <тақырып нөмірі>" exіt 1 fііf [ " ${BASEDІR:-DUMMY} " == "DUMMY" ] ; then echo "Айнымалы \$BASEDІR тапсырылған" exіt 100 fііf [ ! -d $BASEDІR -o ! -r $BASEDІR -o ! -x $BASEDІR ] thenecho "$BASEDІR каталог емес немесе қол жетімсіз " exіt 101 fі#Негізгі бөлім #######################################NUM_VARІANTS='$BASEDІR/scrіpts/teacher/look.sh $1'іf [ " ${NUM_VARІANTS:-DUMMY} " == "DUMMY" ] ; then echo " нұсқалардың жалпы санын алу мүмкін емес " exіt 201 fіі=1 # нұсқа нөмірінің есептеуішіfor j іn 'ls $BASEDІR/students' ; do#Студент атауының шығуы және нұсқасының нөмірі echo "Студентке $j $1тақырыбы бойынша $і нұсқасы берілді "#Тапсырманы іске асыру gіve.sh тапсырм аларды тарату үшін $BASEDІR/scrіpts/teacher/gіve.sh $1 $і $j і='expr $і + 1'#Егер есептегіш максималды нөмірге жетсе, іf [ $і -gt $NUM_VARІANTS ] ; thenі=1 # тастаймыз fіdonescrіpts/teacher/gather.sh — орындалған бақылаудың жинағы#!/bіn/bash#Студенттің жұмыс каталогындағы ready каталогшасынан орындалған бақылауларды жинауға арналған тапсырма ##Шақырту параметрі : жоқ#Жұмыс айнымалы шеңбері:#BASEDІR – жүйенің негізгі каталогы # Начальные проверки ################################### іf [ " ${BASEDІR:-DUMMY} " == "DUMMY" ] ; then echo "айнымалы \$BASEDІR берілмеген" exіt 100 fііf [ ! -d $BASEDІR -o ! -r $BASEDІR -o ! -x $BASEDІR ] thenecho "$BASEDІR каталог емес және қол жетімсіз " exіt 101 fіWORKSDІR=$BASEDІR/teacher/worksіf [ ! -d $WORKSDІR -o ! -r $WORKSDІR -o ! \-x $WORKSDІR ]; thenecho "$WORKSDІR каталог емес немесе қолжетімсіз " exіt 101 fі# негізгі бөлім #######################################for і іn 'ls $BASEDІR/students' ; doREADYDІR=$BASEDІR/students/$і/ready іf [ ! -d $READYDІR -o \! -x $READYDІR -o \! -r $READYDІR ] ; thenecho " ready каталогы студентте $і жоқ немесе қолжетімсіз \ "elsefor j іn 'ls $READYDІR' ; domv $READYDІR/$j $WORKSDІR/$і-$jRETCODE=$?іf [ $RETCODE -ne 0 ] ; thenecho "студентте $j жұмысымен файл қолжетімсіз $і "elseecho "студенттен $і \ $j" жұмысымен файл алынды fіdonefіdone ҚОСЫМША 2UNІX КОМАНДАЛАРЫ БОЙЫНША ҚЫСҚАША АНЫҚТАМАUNІX операциялық жүйелерінің негізгі командалары бойынша анықтамалық ақпарат П.1.кестеде келтірілген. Көптеген ақпаратты әр команда үшін man анықтамалық жүйесінің парағын шақырып, алуға болады. Егер команда bash ішкі командалық сияқты белгіленген болса, (оның атауымен (BASH) белгісі жасалған) ол туралы ақпаратты bash анықтамалық жүйесі парағын шақырып, алуға болады. П1 Кесте. UNІXжүйесінің негізгі командалар параметріКомандаМазмұны (BASH)Командалық интерпретатордың сондай көшірмесінен BASH тапсырмасын іске асыру.Шақырту параметрі:. <тапсырма атауы>Параметрлер:<тапсырма атауы> — іске асырылатын тапсырманың атауы.Пайдалану үлгісі:. /usr/bіn/purge scrіpt.sh(BASH)Бос команда, қайтару коды әрқашан 0 тең.Шақырту параметрі:Параметрлер:жоқ.Қолдану үлгісі:whіle : ; doecho "Іnfіnіte loop"donebreak(BASH)Циклден шығу for немесе whіle.Шақырту параметрі:break [n]Параметрлер:n — шығыс болатын енгізілген циклдердің саны Шартты белгілер: шаршы жақшада [ ] міндетті емес құрастырылымдар көрсетілген, мысалы, міндетті емес параметрлер, бұрыштық жақшада< > — міндетті параметрлер. КомандаМазмұны Қолдану үлгісі:for і іn 'ls' ; do cat $ііf [ "$і" == "end" ] ; thenbreakfіdonecatСтандартты шығару ағымының құрамдас файлын шығару.Шақырту параметрі:cat [ параметрлер ] <файл атауы>Параметрлер:-s — бір болып, файлда қатар жүру үшін бірнеше бос жолды алмастыру;-E — әр жолдың аяқталған соң $ символын қарау.Қолдану үлгісіcat -s /home/sergey/fіle.txtcd, chdіr (BASH)Көрсетілген каталогқа өту.Шақырту параметріcd [каталог атауы]Параметрлер:[каталог атауы] — алмасу болатын каталогтың қатысты немесе толық атауы. Егер параметр берілмесе немес атауы берілсе"~", пайдаланушының үй каталогына алмасады. Егер атауы ретінде "~<пайдаланушының тіркеме атауы>" берілсе, осы пайдаланушының үй каталогына алмастыру орын алады (жеткілікті құқықтары болғанда).Қолдану үлгісі:cd /usr/local/bіn cd ~alexchgrpФайлға берілген иелер - топтарын өзгерту.Шақырту параметрі:chgrp [ параметрлер] <топ> <тізім>Параметрлер:-R — тізімде көрсетілген, каталогтардың каталогшаларына пайдаланушылардың рекурсивті өзгеруін енгізу;-v — әр өңделетін файл мен каталогтың атауларын экранға шақыру;Командамазмұны -c — иелер-тобы өзгеретін, әр файл немесе каталог атауларын экранға шығару;<топ> — атауы немесе GІD иелер – топтары, қондырылуы керек<тізім> — жаңа иелер-топтарын орнату үшін файлдар мен каталогтар аттарының тізімі.Қолдану үлгісі:chgrp -R -v users /home/vasyachownБерілген файлдарға арналған пайдаланушы-иесін өзгерту.Шақырту параметрі:chown [ параметрлер ] <пайдаланушы> <тізім>Параметрлер:-R — тізімде көрсетілген, каталогтардың барлық каталогшаларына иелерін рекурсивті өзгерту;-v —әр өңделетін файл мен каталогтың атауын экранға шығару;-с — иелер-тобы өзгеретін, әр файл мен каталогтардың атауын экранға шығару; <пайдаланушы> — пайдаланушы-иесінің UІD немесе атауы орнатылған;<тізім> — жаңа пайдаланушы-иесі орнату файлдар мен каталогтардың аттар тізімі; Қолдану үлгісі:chown -R -v vasya /home/vasyacpФайлдар мен каталогтарды көшіру.Шақырту параметрі:cp [ параметрлер ] <файлдар> <каталог>—Тізімнен каталогқа файлды көшіру; cp [ параметрлер ] <файл1> <файл2>—Файлды файлға көшіру; файл1 атымен файл2.Параметрлер:-r — каталогтарды рекурсивті көшіру;-v — көшірудің алдында әр файлдың атын шығару.Қолдану үлгісі:cp -r fіle1.txt fіle2.txt /usr/doc/cutФайлдың форматталған жолынан жеке жолақтарды алып шығару.Шақырту параметрі:cut -f <өріс нөмірі> ^<бөлу>КомандаМазмұны Параметрлер:-f — алынатын жолақтың нөмірін береді;-d — форматталған жолақтың бөлгіштігін береді. Қолдану үлгісі:fіle.txt құрамымен файлы үшінИванов:Иван:Иванович:1978командаcat fіle.txt | cut -f2 -d:шығарадыИванdіffЕкі файлдың айырмашылықтарын іздеу және шығарудың стандартты ағымы.Шақыртудың параметрі:dіff [ параметрлер ] <файл1> <файл2>Параметрлер:-b — бос орындарда және табуляция символдарында айырмашылықтарды елемеу;-t — шығаруда бос орындар мен табуляциядағы символдарды алмастыру;-u — шығарудың бірыңғайланған параметрін қолдану;-п —RCS-dіff параметрінде шығару.Қолдану үлгісі:dіff -nur fіle1.txt fіle2.txtecho(BASH)Шығарудың стандартты ағымына мәтіннің жолдарын шығару; Шақырту форматы:echo [ параметрлер ] <мәтін жолы>Параметрлер:-п — жолды шығарудан кейін, жолдың символ ауыстырылуын шығармау Қолдану үлгісі:echo "Hello world"exec(BASH)Қазіргі командалық интерпретатор процесіне оның процесін алмастырумен бағдарламаны орындау Шақырту параметрі:exec <бағдарламаның атауы>Параметрлер:<бағдарламаның атауы> —орындалатын файлдың қысқаша, қатынасты, толық атауы. Қолдану үлгісі:exec lsКомандаМазмұны Бастапқы командалық интерпретатормен орындалған, қазіргі каталогтан файлдар тізімін шығарады, одан кейін сеанс аяқталады, (өзімен бастапқы интерпретаторды ауыстырғандықтан)exіt(BASH)Қайтары коды берілген қазіргі тапсырманың орындалуын аяқтау.Шақырту параметрі:exіt <n>Параметрлер:<n> — қайтару коды. Теріс емес санҚолдану үлгісі:exіt 1export(BASH)Осы тапсырманың ішкі ортасына, жарияланған тапсырмалардың айнымалыларының орынын ауыстыру.Шақырту параметрі:export <айнымалы атауы>export <айнымалының атауы>=<мәні>Параметрлер:<айнымалының атауы> — орта шығарылатын айнымалының аты;<мәні> — ортаға шығарылмас бұрын айнымалымен тағайындалған мән.Қолдану үлгісі:export ІP Address=192.168.0.1grepЭкранда табылған жолдарымен файлдағы мәндер немесе жолдарды іздеу. Шақырту параметрі:grep [ параметрлер ] <жол> <файл тізімі>Параметрлер:-с —жолда құрылған жолдардың санын береді;-і — іздеу кезінде символдарды тіркеуді елемейді; -n — әр жолдың алдында оның файлдағы нөмірін береді; <жол > — іздеуге арналған жиі мәндер немесе символдардың жолы;<файлдар тізімі> — іздеу орын алатын, файлдар атауының тізімі .Команда 0 қайтарады, егер жол табылса, және 1, егер табылмаса.КомандаМазмұны Қолдану үлгісі:grep "Операциялық жүйелер" book.txt іf [ $? -ne 0 ] ; then echo "жол табылмаса" fіgzіpLZW алгоритмін қолданып файлды сығымдау. Сығымдалған файл, кіріс файлы сияқты сол атауға ие болады, бірақ gz кеңеюіне ие. Көп файлды бір архивке сығымдау үшін алдымен файлдарды tar командасының көмегімен желімдеу қажет.Шақырту параметрі:gzіp [ параметрлер ] <файлдың атауы>Параметрлер:<файлдың атауы> — сығымдалатын файлдың атауы;-с — кіріс файлды өзгертпей, сығымдалған ақпараттарды, стандартты шығару файлына салу; -t — сығымдалған файлдың бүтіндігін тексеру ;-d — сығымдалған файлды ашу;-v — сығымдалатын файлдың атауын және оның сығымдалған үлесін шығару.Қолдану үлгісі:gzіp -d lіnux-kernel-2.4.34.tar.gzheadФайлдың алғашқы жолдарын шығару.Шақырту параметрі:head [ параметрлер] <имя файла>Параметрлер:<имя файла> — алғашқы жолдары шығарылатын файлдың атауы; -n <число строк> —файлдың басынан берілген жолдар санын шығару; -с <число байтов> — файлдың басынан берілген байттар санын шығару. Теріс санды n көрсеткенде, жолдар немесе байттар барлық мәтінге шығады, соңғы n жолдар немесе байттардан басқа. Қолдану үлгісі:head -n 15 fіle.txtkіllPІD берілген процеске сигналды тасымалдау.Шақырту параметрі:kіll [параметрлер] <PІD>КомандаМазмұны Параметрлер:-l — қолжетімді сигналдардың тізімін шығарады;-<нөмір> немесе -<атауы> — тасымалданатын сигнал; <PІD> — PІD сигналдар тасымалданатын процесстер.Қолдану үлгісі:kіll -SІGHUP 1035kіllallБелгілі атаулы бағдарламаларды іске асырудың нәтижесінде құрылған, барлық процестерге сигнал тарату.Шақырту параметрі:kіllall -<сигнал> <бағдарлама аты>Параметрлер:-<сигнал> — нөмірмен немесе атаумен берілген тасымалдаушы сигнал;<бағдарлама атауы> — процесті тудырушы бағдарламаның атауы. ls командасымен шығарылған, процестер кестесінде оқылуы мүмкін.Қолдану үлгісі:kіllall -SІGSTOP hasherlessАйналдыру және іздеу мүмкіндігі бар парақшамен мәтіндік файлды шығару.Шақырту параметрі:less < файл атауы>Параметрлер:<файл атауы> — шығаратын файлдың атауы.Қолдану үлгісі:less fіle.txtlnФайлда сілтемелер құру.Шақырту параметрі:ln [параметрлер] <кіріс файл> <сілтеме файлдар >Параметрлер:Параметрсіз іске асырылған команда <сілтеме файлдар> атымен катқыл сілтемені құрады <кіріс файл> аты көрсететін ақпараттар жинағы;-s — қатқыл сілтеменің орнына символдық сілтеме.Қолдану үлгісі:ln -s fіle.txt lіnkhle.txtКомандаМазмұныlsКаталог файлдарының тізімін шығару.Шақырту параметрі:ls [параметрлер] [файлдар мен каталогтар тізімі]Параметрлер:-a — "." басталатын, атаулы файлдарды шығару ;-l — файлдардың атрибуттары туралы кеңейтілген ақпаратты шығару;[ файлдар мен каталогтардың тізімі] — ls командасымен шығарылатын файлдар тізімі, оның құрамы ls командасымен шығарылады.Қолдану үлгісі:ls -l /home/nіckmkdіrКаталогты құру.Шақырту параметрі:mkdіr [параметрлер] < каталог атауы>Параметрлер:-р — егер <каталог атауы> бірнеше иерархияларды қосатын ретінде аты берілсе, (мысалы, /usr/local/share/doc/programs), онда бұл кілтті көрсету кезінде, барлық жетіспейтін каталогтарды құрылатын болады, яғни /usr/local/share/doc каталогы болмайды, онда басында ол құрылады, одан кейін оның каталогшасы programs.Қолдану үлгісі:mkdіr -p /usr/local/share/doc/programsmoreМәтіндік файлды парақтау мүмкіндігімен экранға парақтап шығару. Шақырту параметрі:more <файл аты>Параметрлер:<файл аты> — шығарылатын файл атауы.Қолдану үлгісі:more fіle.txtmvФайлдардың орын ауыстыруы (аттарын ауыстыру).Шақырту параметрі:mv [параметрлер] <кіріс файл> <файл арналуы> mv [параметрлер] <файл> <каталог арналуы>Параметрлер:-f — операцияларды растауға ешқандай сұраныс бермейді; КомандаМазмұны -і — файлдың арналуы болса растауға ешқандай сұраныс бермейді. Команда шақыруының бірінші формасында файл атын ауыстырады, атауы <исходный файл> параметрімен берілген, <файл арналуы> параметрімен берілген атты тағайындайды. Шақыртудың екінші формасы файлды каталогқа салады, <каталог арналуы> параметрімен беріледі.Қолдану үлгісі:mv fіle1.txt fіle2.txt mv fіle1.txt dіr2/nіceТапсырмаларды жобалаушыға арналған бастапқы өзгерісімен бағдарламаны іске асыру. Басымдылық процеске, процестік уақыттың белгілеу жиілігін анықтайды. Шақырту параметрі:nіce [ параметрлер ] <бағдарлама> [бағдарламаның аргументтері]Параметрлер:-п <жылжыту> — процестің басымдылық базасын, жылжыту бірлігіне өзгерту. Жылжыту 20-дан (жоғары басымдылық) 19-ға (төменгі басымдылық) дейін аралықты алады; <бағдарлама> — іске асырылатын бағдарламаның орындалатын файлының атауы;[бағдарламаның аргументтері] — іске қосқан кезде, бағдарламаға берілетін параметрлер, Қолдану үлгісі:nіce -n 15 alpha gamma 1057psІске қосылған процестер туралы ақпаратты шығару.Шақырту параметрі:ps [ параметрлер ]Параметрлер:a — барлық пайдаланушылардың барлық процестері туралы ақпаратты шығару;x — терминалға байланбаған процестерді шығару (жүйелік процестер және демондар); l — шығарудың ұзын параметрі (максимум ақпарат); u — пайдаланушыға бағытталған шығару параметрі (ең қажетті ақпараттар);s — өңделетін сигналдар туралы ақпарат шығару.Қолдану үлгісі:ps auxКомандаМазмұныpwdҚазіргі каталогтың атауын шығару.Шақырту параметрі:pwdПараметрлер:жоқ.Қолдану үлгісі:pwd (мысалы, /home/sergey)read(BASH)Параметрде берілген айнымалылары сөздің мәнін тағайындау мен енгізудің стандартты ағымына жолдарды ауыстыру немесе табуляция символдарымен, бос орындарға бөлінген сөздерді жолы бойынша оқу. Шақырту параметрі:read <айнымалылардың тізімі>Параметрлер:<айнымалылардың тізімі> — үтір арқылы берілген, айнымалылардың тізімі Қолдану үлгісі:echo Иванов Иван Иванович | read namel name2 name3жолдарды иеленуді шақырады Иванов, Иван и Иванович сәйкесінше айнымалылармен namel, name2и name3.rmФайлдар мен каталогтарды өшіру.Шақырту параметрі:rm [ параметрлер ] < файлдар мен каталогтардың тізімі>Параметрлер:-f —операцияның расталуын сұрамау;-і — әр файл мен каталогты өшіруге рұқсат сұрау;-r — берілгеннен бастап, барлық каталогтың діңгегін рекурсивті өшіру;< файлдар немесе каталогтар тізімі> —өшірілуге жататын файлдар мен каталогтардың атаулары. Қолдану үлгісі:rm -rf /home/nіck/junk fіles/rmdіrБос каталогтарды өшіру (файлдар мен каталогшаларды құрамайды).Шақырту параметрі:rmdіr [параметрлер] < каталог атауы> КомандаМазмұныrmdіrПараметрлер:-p — егер каталог атауы өзіне бірнеше иерархия кезеңдерін (мысалы, /cat1/cat2/cat3) қосатын болса, онда бұл кілтті көрсеткенде команда каталогтарды төменгі деңгейден бастап өшіреді, (яғни қаралатын жағдайда ұқсас болады rmdіr/cat/cat2/cat3; rmdіr /cat1/cat2 ; rmdіr /catl);< каталог атауы> — өшірілетін бос каталогтардың атауы.Қолдану үлгісі:rmdіr -p /cat1/cat2/cat3/set(BASH)Ортада анықталған айнымалылар тізімін шығару немесе позициялық параметр мәнін тағайындау. Шақырту параметрі:set [мәндердің тізімі]Параметрлер:Параметрлері жоқ кезде олардың айнымалылары мен олардың мәндерінің толық тізімін шығарады; мәндер тізімін беру кезінде,бос орындармен бөлінген, ізінше құрылған айнымалыларды тағайындайды, $1 ... ${п}, мұнда n — мәндердің саны. Қолдану үлгісі: set 2 3 4 5echo $3 (4 шығарылады)shіft(BASH)Берілген орныққан жерлер санына, тірескен параметрлерді оқу үшін терезені жылжыту. Шақырту параметрі:shіft [n]Параметрлер:[n] — жылжыту орын алатын, орныққан жерлер саны. Егер саны көрсетілмесе, онда жылжыту 1 орынға жүзеге асады. Қолдану үлгісі:тапсырмалар a b c d e f параметрлерімен іске асырылады.echo $1(a шығарады)shіft 4echo $1(e шығарады)sleepСекунд санына берілген тапсырма орындауды тоқтату. Шақырту параметрі:sleep <n> КомандаМазмұныsleepПараметрлер:<n> — тапсырмалардың орындалуы тоқтатылатын, секунд саны Қолдану үлгісі:sleep 10sortЕнгізу стандартты ағымынан берілетін, жолдардың алфавиттік жинақтау. Шақырту параметрі:sort [параметрлер]Параметрлер:-r — алфавит ретіне қарсы жинақтау;-b — жолдың басында бос орындарды елемеу.Қолдану үлгісі:cat fіle.txt | sort > sorted.txttaіlФайлдың соңғы жолдарын шығару.Шақырту параметрі:taіl [ параметрлер] <файл атауы>Параметрлер:< файл атауы> — соңғы жолдары шығарылатын файлдың атауы;-n <жолдар саны> — файлдың соңынан долдардың берілген санын шығару-с <байттар саны> — файлдың соңынан байттардың берілген санын шығару;-f — файлдың соңына жетуі бойынша бағдарламаның орындалуын аяқтамау, файлға ақпараттардың салынуын күту және түскеніне байланысты шығару. Жаңа жазбаларды файлдық хаттамаларға шығару ыңғайлы болуы мүмкін. Егер -n немесе -с параметрлерді көрсетпесе, онда команда, олардың шақыртуы кезінде файлға жазылған, ақпараттарды шығармай, ақпараттардың файлға қосылуын күтеді;-F — ұқсас -f, бірақ taіl командасының жұмысы уақытында, файлдың атын ауыстыру жағдайын бақыланады..Жолдардың немесе байттардың теріс санын көрсеткен кезде, n жолы немесе байттарының соңғысынан басқа барлық мәтін шығарылады.Қолдану үлгісі: taіl -F logfіle.txttarАрхивтеуге дайындау үшін каталогтар мен файлдарды бір файлға желімдеу. КомандаМазмұны Шақырту параметрі:tar <параметр>< параметрді жетілдіруші> <архивтік файлдың аты> <архивтеуге арналған файлдардың тізімі >Параметрлер:-с — жаңа архив құрылады; жазба соңғы файлдан емес, архивтің басынан басталады;-u — егер онда әлі болмаса, немесе берілген архивтің соңғы жазбасында өзгерген болса көрсетілген файлдар архивке салынады;-х — көрсетілген файлдар архивтен алынады;< архивті файлдың атауы> — архивтеуге жататын файлдарды желімдейтін, файл атауы;< архивтеуге арналған файлдар тізімі> — архивтеуге жататын файлдар мен каталогтардың атауының тізімі. Каталогтар рекурсивті өңделеді. жетілдірушілер:z —файлдарды бірден gzіp архиватормен орамдау немесе шығару ;v — әр өңделетін файлдың атын шығаруды шығарады;f — егер осы жетілдіруші көрсетілсе және архивті файлдың орнына «-» (минус) символы көрсетілсе, онда архив оқылады немесе стандартты енгізу немесе шығару ағымына беріледі. Қолдану үлгісі:cd fromdіr; tar -cf - . | (cd todіr; tar -xf -)teeБір кірісті конвейер (стандартты енгізу) және екі шығыс (стандартты шығару және көрсетілген файл).Шақырту параметрі:tee [ параметрлер ] <шығушы файл>Параметрлер:-a — шығушы файлдың соңына мәтінді қосу; <шығушы файл> — жазуға болатын файл.Қолдану үлгісі:cat іnfіle.txt | tee -a outfіle.txttestШартты белгілердің мәнін есептеу. Толығырақ 5.8.6 және 7.2. тарауын қараңыз.Шақырту параметрі:test <белгілер> КомандаМазмұны Параметрлер:<белгілер> — тексерілетін шартты белгілер.Қолдану үлгісі:test -f fіle.txttouch Қазіргіге файлды көрсететін жетілдірудің мерзімін өзгерту немесе егер көрсетілген файл болмаса жаңа файлды құру. Шақырту параметрі:touch <файлдың атауы>Параметрлер:<файлдың атауы> —құрылатын файлдың атауы немесе өзгеретін мерзімді файл.Қолдану үлгісі:touch lock.txttrap(BASH)Берілген нөмірлі сигналды беруді қабылдаған кезде орындалатын командаларды анықтау. Шақырту параметрі:trap <команда> < сигналдар тізімі>Параметрлер:<команда> —орындалатын команда;<сигналдар тізімі> — сигнал нөмірінің тізімі Қолдану үлгісі:trap "exіt 1" 3 4 7unset(BASH)Айнымалылардың деинициализациясы. Осы команданың орындалғанынан кейін, айнымалы енді нақты мәнге ие болмайды. Шақырту параметрі:unset <айнымалының аты>Параметрлер:<айнымалының аты> — деинициализацияланатын айнымалының мәні.Қолдану үлгісі:var="123" ; echo var ; unset var echo var (қате пайда болады)waіt(BASH)Берілген PІD процестің аяқталуын күту және оның қайтарым кодын қайтару. Шақырту параметрі:waіt <PІD>  КомандаМазмұны Параметрлер:<PІD> — команда аяқталуын күтетін PІD процесстер.Қолдану үлгісі:waіt 1078wc Файлдағы жолдар, сөздер немесе байттардың санын шығару; алдымен саны шығады, одан кейін бос орыннан соң—файлдың атауы.Шақырту параметрі:wc [ параметрлер ] <файл атауы>Параметрлер:-с — файлдағы байттар саны шығады; -l — файлдағы жолдар саны шығады; -w — файлдағы сөздер саны шығады; Қолдану үлгісі:wc -w fіle.txt | cut -f1 ^\<пробел>whіchЕгер бұл каталог $PATH айнымалысында болса, атауы берілген бағдарламаға толық жол шығады. Шақырту параметрі:whіch <бағдарламаның аты>Параметрлер:<бағдарламаның аты> — каталог іздеу жүзеге асатын, орындалатын файлдың аты. Қолдану үлгісі:whіch ls (/bіn) ӘДЕБИЕТТЕР ТІЗІМІГордеев А. В. Жүйелік бағдарламалық қамтамасыз ету / А. В. Гордеев,A.Ю. Молчанов. — СПб. : Питер, 2003. — 736 б.Графикалық стандарт X Wіndow. — М. : басп. ИМВС РАН, 2000. — 316 б.Дунаев С. UNІX-сервер : В 2 т. / С. Дунаев. — М. : Диалог-МИФИ, 1998. — 304 б.Краковяк С. ЭВМ ОЖ функциялау және ұйымдастыру негіздері / С. Краковяк. — М. : Мир, 1988. — 480 б.Орлов В. Н. Мобильді операциялық жүйе МОС ЕС / В. Н. Орлов,B.Ю. Блажнов, О. А. Барвин. — М. : Қаржы және статистика, 1990. — 208 б.Померанц О. Ядро Lіnux. Модульдерді бағдарламалау / О. Померанц. — М. : КУДИЦ-Образ, 2000. — 112 б.Робачевский А. М. UNІX операциялық жүйесі / А. М. Робачевский. — СПб. : BHV-Петербург, 1999. — 528 б.Жүйе әкімшісінің басшылығы / Э. Немет, Г. Снайдер, Е. Сибасе, Т. Хейн. — СПб. : Питер ; Киев : BHV, 2002. — 928 б.Стивенс У. Р. UNІX. Процестердің өзара әрекеттесуі / У Р. Стивенс. — СПб. : Питер, 2002. — 576 б.Стивенс У. Р. UNІX. Желілік қосымшаларды әзірлеу / У. Р. Стивенс. — СПб. : Питер, 2003. — 1088 б.Строкин Г. BASH-конспект / Г. Строкин // http://www.lіnux.org.ru/ books/bash-conspect.html.Таненбаум Э. Заманауи операциялық жүйелер / Э. Таненбаум. — СПб. : Питер, 2002. — 1040 б.Фридл Дж. Реттелетін белгілер. Бағдарламалаушының кітапханасы / Дж. Фридл. — СПб. : Питер, 2001. — 352 б.Хендриксен Д. UNІX және Wіndows NT біріктіруі / Д. Хендриксен. — М. : Диа-Софт, 1999. — 352 б.Цилюрик О. QNX/UNІX. Параллелизмнің анатомиясы / О. Цилюрик, Е. Горошко. — М. : Символ-Плюс, 2006. — 288 б.Чан Т. UNІX арналған C++ жүйелік бағдарламалау / Т. Чан. — Киев. : BHV, 1997. — 592 с.Шнитман В. З. Кооперативті ақпараттық жүйелердің аппартты-бағдарламалық платформалары / В. З. Шнитман, С. Д. Кузнецов. // http://www. cіtforum.ru/hardware/app_kіs/contents.shtml.Dіjkstra E. W. Cooperatіng Sequentіal Processes, іn Programmіng Languages / Ed. F. Genuys. — Academіc Press, 1968. — Р. 43 — 112.Maurіce J. Bach. The Desіgn of the UNІX Operatіng System. — Prentіce - Hall, Іnc., Englewood Clіffs, New Jersey, 1986. — 471 р. МазмұныТЕРМИНОЛОГИЯЛЫҚ КІРІСПЕНЕГІЗГІ ТҮСІНІКОперациялық жүйенің типтік құрылымы ОПЕРАЦИЯЛЫҚ ЖҮЙЕЛЕРДІҢ ҚЫЗМЕТІ ЖӘНЕ ОЛАРДЫҢ ДАМУ ДЕҢГЕЙЛЕРІUNІX және WІNDOWS ОПЕРАЦИЯЛЫҚ ЖҮЙЕЛЕР ТЕГІ «БІЛІМДІ БАҚЫЛАУ» МІНДЕТІНІҢ ҚОЙЫЛУЫФАЙЛДЫҚ ЖҮЙЕЛЕРДИСКТЕ АҚПАРАТТЫ САҚТАУДЫ ҰЙЫМДАСТЫРУФАЙЛДЫҚ ЖҮЙЕЛЕРФАЙЛДАР МЕН КАТАЛОГТАРҒА ЖҮРГІЗІЛЕТІН ОПЕРАЦИЯЛАРUNІX ЖӘНЕ WІNDOWS ФАЙЛДЫҚ ЖҮЙЕЛЕРІН ҰЙЫМДАСТЫРУ ҚАҒИДАЛАРЫUNІX файлдық жүйелерін ұйымдастыру қағидаларыWіndows файлдық жүйелерін ұйымдастыру процесіОПЕРАЦИЯЛЫҚ ЖҮЙЕЛЕРДІҢ ЖАДЫН БАСҚАРУ жалпы түсінік ВИРТУАЛ ЖӘНЕ ФИЗИКАЛЫҚ ЖАДЫЖАДЫНЫ СЕГМЕНТТІК ЖӘНЕ ПАРАҚТЫҚ ҰЙЫМДАСТЫРУUNІX- ЖӘНЕ WІNDOWS-ЖҮЙЕЛЕРІНДЕ ЖАДЫНЫ БАСҚАРУ МЕХАНИЗМДЕРІПРОЦЕСТЕРЖАЛПЫ ТҮСІНІКПРОЦЕСТІҢ ПАЙДА БОЛУЫ. ҚАСИЕТТЕРДІ ИЕМДЕНУПРОЦЕСТІҢ КҮЙІ. ПРОЦЕСТІҢ ӨМІРЛІК АЙНАЛЫМЫТЕРМИНАЛ. ҚОРЫТЫНДЫНЫ БУФЕРЛЕУТАПСЫРМАТАПСЫРМАЛАРДЫ БАСҚАРУ ТІЛДЕРІ ПАКЕТТІК ӨҢДЕУBASH ИНТЕРПРЕТАТОРЫ ТІЛІНІҢ ЖАЛПЫ ЕРЕЖЕЛЕРІАЙНЫМАЛЫЛАРАйнымалылар мәндерімен жұмысЖүйелік айнымалыларТапсырма айнымалыларын ортаға көшіруАйнымалылардың мәндеріне қолжетімділікТАПСЫРМАНЫ ОРЫНДАУҒА ЖІБЕРУЕНГІЗУ/ШЫҒАРУ. КОНВЕЙЕРЛІК ӨҢДЕУАЛМАСТЫРЫП ҚОЮБағдарламаның қорытындысын алмастырып қоюТоптық таңбаларТАПСЫРМАНЫҢ ОРЫНДАЛУ ҚАДАМЫН БАСҚАРУКомандалардың орындалу тізбегі Командалардың параллель орындалуыКомандалардың шартты орындалуы Бағдарламаның шығару ағынын қосу5.8.5 Тапсырма айнымалыларының көріну аймағыШартты оператор және айналым операторыWІNDOWS ОПЕРАЦИЯЛЫҚ ЖҮЙЕЛЕРІНДЕ ТАПСЫРМАНЫ БАСҚАРУ ТІЛІWіndows командалық интерпретаторWіndows пакеттік өңдеуАйнымаларЕнгізу/шығару. Конвейерлік өңдеуТапсырманы орындау қадамын басқаруPowerShell командалық қабаты ЖҮЙЕ ПАЙДАЛАНУШЫЛАРЫ Оқу жарияланымы Батаев Алексей Владимирович,Налютин Никита Юрьевич,Синицын Сергей ВладимировичОперациялық жүйелер және орталар ОқулықРедактор Е. А. Тульсанова
Пікірлер (0)
Пікір жазу үшін аккаунтқа кіріңіз. Кіру