PRILOZHENIE. SISTEMNYE OPERACII V prilozhenii daetsya kratkij obzor funkcij sistemy UNIX. Polnoe opisanie etih funkcij soderzhitsya v rukovodstve programmista-pol'zovatelya versii V sistemy UNIX. Svedenij, privedennyh zdes', vpolne dostatochno dlya togo, chtoby razobrat'sya v primerah programm, predstavlennyh v knige. Imena fajlov, upominaemye v tekste, predstavlyayut soboj posledovatel'nos- ti simvolov, zavershayushchiesya pustym simvolom i sostoyashchie iz komponent, razde- lennyh naklonnoj chertoj. V sluchae oshibki vse funkcii vozvrashchayut kod zavershe- niya, ravnyj -1, a kod samoj oshibki zasylaetsya v peremennuyu errno, imeyushchuyu tip external. V sluchae uspeshnogo zaversheniya kod vozvrata imeet znachenie, ravnoe 0. Nekotorye iz obrashchenij k operacionnoj sisteme yavlyayutsya tochkoj vho- da srazu dlya neskol'kih funkcij: eto oznachaet, chto dannye funkcii ispol'zuyut odin i tot zhe assemblernyj interfejs. Privodimyj spisok funkcij udovletvorya- et standartnym usloviyam, prinyatym v spravochnyh rukovodstvah po sisteme UNIX, pri etom voprosy, svyazannye s tem, yavlyaetsya li odno obrashchenie k operacionnoj sisteme tochkoj vhoda dlya odnoj ili neskol'kih funkcij, rassmatrivayutsya ot- del'no. access ______________________________ access(filename,mode) char *filename; int mode; Funkciya access proveryaet, imeet li process razreshenie na chtenie, zapis' ili ispolnenie fajla (proveryaemyj tip dostupa zavisit ot znacheniya parametra mode). Znachenie mode yavlyaetsya kombinaciej dvoichnyh masok 4 (dlya chteniya), 2 (dlya zapisi) i 1 (dlya ispolneniya). Vmesto ispolnitel'nogo koda identifikacii pol'zovatelya v proverke uchastvuet fakticheskij kod. acct ______________________________ acct(filename) char *filename; Funkciya acct vklyuchaet uchet sistemnyh resursov, esli parametr filename nepustoj, i vyklyuchaet - v protivnom sluchae. alarm ______________________________ unsigned alarm(seconds) unsigned seconds; Funkciya alarm planiruet posylku vyzyvayushchemu ee processu signala trevogi cherez ukazannoe kolichestvo sekund (seconds). Ona vozvrashchaet chislo sekund, ostavsheesya do posylki signala ot momenta vyzova funkcii. 400 brk ______________________________ int brk(end_data_seg) char *end_data_seg; Funkciya brk ustanavlivaet verhnyuyu granicu (starshij adres) oblasti dannyh processa v sootvetstvii so znacheniem parametra end_data_seg. Eshche odna funk- ciya, sbrk, ispol'zuet tu zhe tochku vhoda i uvelichivaet adres verhnej granicy oblasti na ukazannuyu velichinu. shdir ______________________________ chdir(filename) char *filename; Funkciya chdir delaet tekushchim katalogom vyzyvayushchego processa katalog, ukazannyj v parametre filename. shmod ______________________________ chmod(filename,mode) char *filename; Funkciya chmod izmenyaet prava dostupa k ukazannomu fajlu v sootvetstvii so znacheniem parametra mode, yavlyayushchimsya kombinaciej iz sleduyushchih kodov (v vos'merichnoj sisteme): 04000 bit ustanovki koda identifikacii pol'zovatelya 02000 bit ustanovki gruppovogo koda identifikacii 01000 priznak sticky bit 00400 chtenie vladel'cem 00200 zapis' vladel'cem 00100 ispolnenie vladel'cem 00040 chtenie gruppovym pol'zovatelem 00020 zapis' gruppovym pol'zovatelem 00010 ispolnenie gruppovym pol'zovatelem 00004 chtenie prochim pol'zovatelem 00002 zapis' prochim pol'zovatelem 00001 ispolnenie prochim pol'zovatelem showp ______________________________ chown(filename,owner,group) char *filename; int owner,group; Funkciya chown menyaet kody identifikacii vladel'ca i gruppy dlya ukazanno- go fajla na kody, ukazannye v parametrah owner i group. shroot ______________________________ 401 chroot(filename) char *filename; Funkciya chroot izmenyaet chastnyj koren' vyzyvayushchego processa v sootvetst- vii so znacheniem parametra filename. slose ______________________________ close(fildes) int fildes; Funkciya close zakryvaet deskriptor fajla, poluchennyj v rezul'tate vypol- neniya funkcij open, creat, dup, pipe ili fcntl, ili unasledovannyj ot funk- cii fork. sreat ______________________________ creat(filename,mode) char *filename; int mode; Funkciya creat sozdaet novyj fajl s ukazannymi imenem i pravami dostupa. Parametr mode imeet tot zhe smysl, chto i v funkcii access, pri etom priznak sticky-bit ochishchen, a razryady, ustanovlennye funkciej umask, sbrosheny. Funk- ciya vozvrashchaet deskriptor fajla dlya posleduyushchego ispol'zovaniya v drugih fun- kciyah. dir ______________________________ dup(fildes) int fildes; Funkciya dup sozdaet kopiyu ukazannogo deskriptora fajla, vozvrashchaya desk- riptor s naimen'shim nomerom iz imeyushchihsya v sisteme. Staryj i novyj deskrip- tory ispol'zuyut odin i tot zhe ukazatel' na fajl, a takzhe i drugie sovpadayu- shchie atributy. ehes ______________________________ execve(filename,argv,envp) char *filename; char *argv[]; char *envp[]; Funkciya execve ispolnyaet fajl s imenem filename, zagruzhaya ego v adresnoe prostranstvo tekushchego processa. Parametr argv sootvetstvuet spisku argumen- tov simvol'nogo tipa, peredavaemyh zapuskaemoj programme, parametr envp so- otvetstvuet massivu, opisyvayushchemu sredu vypolneniya novogo processa. 402 ehit ______________________________ exit(status) int status; Funkciya exit zavershaet vyzyvayushchij process, vozvrashchaya ego roditelyu 8 mladshih razryadov iz slova sostoyaniya processa. YAdro samo mozhet vyzyvat' etu funkciyu v otvet na postuplenie opredelennyh signalov. fcntl ______________________________ fcntl(fildes,cmd,arg) int fildes,cmd,arg; Funkciya fcntl obespechivaet vypolnenie nabora raznoobraznyh operacij po otnosheniyu k otkrytym fajlam, identificiruemym s pomoshch'yu deskriptora fildes. Parametry cmd i arg interpretiruyutsya sleduyushchim obrazom (opredelenie bukven- nyh konstant hranitsya v fajle "/usr/include/fcntl.h"): F_DUPFD vernut' naimen'shee znachenie deskriptora, bol'shee ili ravnoe znacheniyu arg F_SETFD ustanovit' flag "close-on-exec" v mladshem razrya- de arg (fajl budet zakryt funkciej exec) F_GETFD vernut' sostoyanie flaga "close-on-exec" F_SETFL ustanovit' flagi, upravlyayushchie sostoyaniem fajla (O_NDELAY - ne priostanavlivat'sya v ozhidanii za- versheniya vvoda-vyvoda, O_APPEND - zapisyvaemye dannye dobavlyat' v konec fajla) F_GETFL poluchit' znacheniya flagov, upravlyayushchih sostoyaniem fajla struct flock short l_type; /* F_RDLCK - blokirovka chteniya, F_WRLCK - blokirovka zapisi, F_UNLCK - snyatie blokirovki */ short l_whence; /* adres nachala blokiruemogo uchast- ka daetsya v vide smeshcheniya otno- sitel'no nachala fajla (0), otno- sitel'no tekushchej pozicii ukaza- telya (1), otnositel'no konca fajla (2) */ long l_start; /* smeshchenie v bajtah, interpretiru- emoe v sootvetstvii so znacheniem l_whence */ long l_len; /* dlina blokiruemogo uchastka v bajtah. Esli ukazan 0, blokiru- etsya uchastok ot l_start do konca fajla */ long l_pid; /* identifikator processa, blokiru- yushchego fajl */ long l_sysid; /* sistemnyj identifikator proces- sa, blokiruyushchego fajl */ F_GETLK prochitat' pervyj kod blokirovki, meshayushchej is- pol'zovat' znachenie arg i zatirat' ego. Esli blokirovka otsutstvuet, pomenyat' znachenie l_type v arg na F_UNLCK 403 F_SETLK ustanovit' ili snyat' blokirovku fajla v zavisi- mosti ot znacheniya arg. V sluchae nevozmozhnosti ustanovit' blokirovku vernut' -1 F_SETLKW ustanovit' ili snyat' blokirovku soderzhashchihsya v fajle dannyh v zavisimosti ot znacheniya arg. V sluchae nevozmozhnosti ustanovit' blokirovku pri- ostanovit' vypolnenie Blokirovki, svyazannye s chteniem iz fajla, mogut perekryvat' drug dru- ga. Blokirovki, svyazannye s zapis'yu, perekryvat'sya ne mogut. fork ______________________________ fork() Funkciya fork sozdaet novyj process. Porozhdaemyj process predstavlyaet so- boj logicheskuyu kopiyu processa-roditelya. Na vyhode iz funkcii processu-rodi- telyu vozvrashchaetsya kod identifikacii potomka, potomku - nulevoe znachenie. getpid ______________________________ getpid() Funkciya getpid vozvrashchaet identifikator vyzyvayushchego processa. |tu zhe tochku vhoda ispol'zuyut funkcii: getpgrp, vozvrashchayushchaya identifikator gruppy, v kotoruyu vhodit vyzyvayushchij process, i getppid, vozvrashchayushchaya identifikator processa, kotoryj yavlyaetsya roditelem tekushchego processa. getuid ______________________________ getuid() Funkciya getuid vozvrashchaet fakticheskij kod identifikacii pol'zovatelya vy- zyvayushchego processa. |tu zhe tochku vhoda ispol'zuyut funkcii: geteuid, vozvra- shchayushchaya ispolnitel'nyj kod identifikacii pol'zovatelya, getgid, vozvrashchayushchaya gruppovoj kod, i getegid, vozvrashchayushchaya ispolnitel'nyj gruppovoj kod identi- fikacii vyzyvayushchego processa. ioctl ______________________________ ioctl(fildes,cmd,arg) int fildes,cmd; Funkciya ioctl vypolnyaet nabor special'nyh operacij po otnosheniyu k otkry- tomu ustrojstvu, deskriptor kotorogo ukazan v parametre fildes. Tip komandy, vypolnyaemoj po otnosheniyu k ustrojstvu, opisyvaetsya parametrom cmd, a para- metr arg yavlyaetsya argumentom komandy. kill ______________________________ 404 kill(pid,sig) int pid,sig; Funkciya kill posylaet processam, identifikatory kotoryh ukazany v para- metre pid, signal, opisyvaemyj parametrom sig. pid imeet signal posylaetsya processu s identifika- polozhitel'- torom pid noe znachenie pid = 0 signal posylaetsya processam, gruppovoj identifikator kotoryh sovpadaet s iden- tifikatorom otpravitelya pid = -1 esli process-otpravitel' ispolnyaetsya pod identifikatorom superpol'zovatelya, sig- nal posylaetsya vsem processam, v protiv- nom sluchae, signal posylaetsya processam, fakticheskij kod identifikacii pol'zova- telya u kotoryh sovpadaet s identifikato- rom superpol'zovatelya pid < -1 signal posylaetsya processam, gruppovoj identifikator kotoryh sovpadaet s pid Ispolnitel'nyj kod identifikacii pol'zovatelya processa-otpravitelya dol- zhen ukazyvat' na superpol'zovatelya, v protivnom sluchae, fakticheskij ili is- polnitel'nyj kody identifikacii otpravitelya dolzhny sovpadat' s sootvetstvuyu- shchimi kodami processov-poluchatelej. link ______________________________ link(filename1,filename2) char *filename1,*filename2; Funkciya link prisvaivaet fajlu filename1 novoe imya filename2. Fajl sta- novitsya dostupnym pod lyubym iz etih imen. lseek ______________________________ lseek(fildes,offset,origin) int fildes,origin; long offset; Funkciya lseek izmenyaet polozhenie ukazatelya chteniya-zapisi dlya fajla s deskriptorom fildes i vozvrashchaet novoe znachenie. Polozhenie ukazatelya zavisit ot znacheniya parametra origin: 0 ustanovit' ukazatel' na poziciyu, sootvetstvuyushchuyu uka- zannomu smeshcheniyu v bajtah ot nachala fajla 1 sdvinut' ukazatel' s ego tekushchej pozicii na ukazannoe smeshchenie 2 ustanovit' ukazatel' na poziciyu, sootvetstvuyushchuyu uka- zannomu smeshcheniyu v bajtah ot konca fajla mknod ______________________________ 405 mknod(filename,modes,dev) char *filename; int mode,dev; Funkciya mknod sozdaet special'nyj fajl, katalog ili poimenovannyj kanal (ochered' po principu "pervym prishel - pervym vyshel") v zavisimosti ot znache- niya parametra modes: 010000 poimenovannyj kanal 020000 special'nyj fajl ustrojstva vvoda-vyvoda simvolami 040000 katalog 060000 special'nyj fajl ustrojstva vvoda-vyvoda blokami 12 mladshih razryadov parametra modes imeyut tot zhe samyj smysl, chto i v funkcii chmod. Esli fajl imeet special'nyj tip, parametr dev soderzhit star- shij i mladshij nomera ustrojstva. mount ______________________________ mount(specialfile,dir,rwflag) char *specialfile,*dir; int rwflag; Funkciya mount vypolnyaet montirovanie fajlovoj sistemy, na kotoruyu ukazy- vaet parametr specialfile, v kataloge dir. Esli mladshij bit parametra rwflag ustanovlen, fajlovaya sistema montiruetsya tol'ko dlya chteniya. msgctl ______________________________ #include #include #include msgctl(id,cmd,buf) int id,cmd; struct msgid_ds *buf; V zavisimosti ot operacii, ukazannoj v parametre cmd, funkciya msgctl da- et processam vozmozhnost' ustanavlivat' ili zaprashivat' informaciyu o statuse ocheredi soobshchenij s identifikatorom id, a takzhe udalyat' ochered' iz sistemy. Struktura msquid_ds opredelena sleduyushchim obrazom: struct ipc_perm { ushort uid; /* identifikator tekushchego pol'zovatelya */ ushort gid; /* identifikator tekushchej gruppy */ ushort cuid; /* identifikator pol'zovatelya-sozdatelya */ ushort cgid; /* identifikator gruppy sozdatelya */ ushort mode; /* prava dostupa */ short pad1; /* ispol'zuetsya sistemoj */ long pad2; /* ispol'zuetsya sistemoj */ }; struct msquid_ds { struct ipc_perm msg_perm; /* struktura, opisyvayushchaya prava dostupa */ 406 short pad1[7]; /* ispol'zuetsya sistemoj */ ushort msg_qnum; /* kolichestvo soobshchenij v ocheredi */ ushort msg_qbytes; /* maksimal'nyj razmer ocheredi v bajtah */ ushort msg_lspid; /* identifikator processa, svyazannogo s poslednej posylkoj soobshcheniya */ ushort msg_lrpid; /* identifikator processa, svyazannogo s poslednim polucheniem soobshcheniya */ time_t msg_stime; /* vremya poslednej posylki soobshcheniya */ time_t msg_rtime; /* vremya poslednego polu- cheniya soobshcheniya */ time_t msg_ctime; /* vremya poslednego izme- neniya */ }; Tipy operacij: IPC_STAT Prochitat' v bufer zagolovok ocheredi soobshchenij, as- sociirovannyj s identifikatorom id IPC_SET Ustanovit' znacheniya peremennyh msg_perm.uid, msg_perm.gid, msg_perm.mode (9 mladshih razryadov struktury msg_perm) i mgr_qbytes v sootvetstvii so znacheniyami, soderzhashchimisya v bufere IPC_RMID Udalit' iz sistemy ochered' soobshchenij s identifika- torom id msgget ______________________________ #include #include #include msgget(key,flag) key_t key; int flag; Funkciya msgget vozvrashchaet identifikator ocheredi soobshchenij, imya kotoroj ukazano v key. Parametr key mozhet ukazyvat' na to, chto vozvrashchaemyj identi- fikator otnositsya k chastnoj ocheredi (IPC_PRIVATE), v etom sluchae sozdaetsya novaya ochered' soobshchenij. S pomoshch'yu parametra flag mozhno sdelat' ukazanie o neobhodimosti sozdaniya ocheredi (IPC_CREAT), a takzhe o tom, chto sozdanie oche- redi dolzhno vypolnyat'sya monopol'no (IPC_EXCL). V poslednem sluchae, esli oche- red' uzhe sushchestvuet, funkciya msgget daet otkaz. msgsnd i msgrcv ______________________________ #include #include #include msgsnd(id,msgp,size,flag) 407 int id,size,flag; struct msgbuf *msgp; msgrcv(id,msgp,size,type,flag) int id,size,type,flag; struct msgbuf *msgmp; Funkciya msgsnd posylaet soobshchenie ukazannogo razmera v bajtah (size) iz bufera msgp v ochered' soobshchenij s identifikatorom id. Struktura msgbuf opre- delena sleduyushchim obrazom: struct msgbuf { long mtype; char mtext[]; }; Esli v parametre flag bit IPC_NOWAIT sbroshen, funkciya msgsnd budet pri- ostanavlivat'sya v teh sluchayah, kogda razmer otdel'nogo soobshcheniya ili chislo soobshchenij v sisteme prevyshayut dopustimyj maksimum. Esli bit IPC_NOWAIT usta- novlen, funkciya msgsnd v etih sluchayah preryvaet svoe vypolnenie. Funkciya msgrcv prinimaet soobshchenie iz ocheredi s identifikatorom id. Esli parametr type imeet nulevoe znachenie, iz ocheredi budet vybrano soobshchenie, pervoe po schetu; esli polozhitel'noe znachenie, iz ocheredi vybiraetsya pervoe soobshchenie dannogo tipa; esli otricatel'noe znachenie, iz ocheredi vybiraetsya soobshchenie, imeyushchee samyj mladshij tip sredi teh tipov, znachenie kotoryh ne prevyshaet absolyutnoe znachenie parametra type. V parametre size ukazyvaetsya maksimal'nyj razmer soobshcheniya, ozhidaemogo pol'zovatelem. Esli v parametre flag ustanovlen bit MSG_NOERROR, v tom sluchae, kogda razmer poluchaemogo so- obshcheniya prevysit predel, ustanovlennyj parametrom size, yadro obrezhet eto so- obshchenie. Esli zhe sootvetstvuyushchij bit sbroshen, v podobnyh sluchayah funkciya bu- det vozvrashchat' oshibku. Esli v parametre flag bit IPC_NOWAIT sbroshen, funkciya msgrcv priostanovit svoe vypolnenie do teh por, poka soobshchenie, udovletvorya- yushchee ukazannomu v parametre type usloviyu, ne budet polucheno. Esli sootvetst- vuyushchij bit sbroshen, funkciya zavershit svoyu rabotu nemedlenno. Funkciya msgrcv vozvrashchaet razmer poluchennogo soobshcheniya (v bajtah). pise ______________________________ nice(increment) int increment; Funkciya nice uvelichivaet znachenie sootvetstvuyushchej komponenty, uchastvuyu- shchej v vychislenii prioriteta planirovaniya tekushchego processa, na velichinu increment. Uvelichenie znacheniya nice vedet k snizheniyu prioriteta planirova- niya. opep ______________________________ #include open(filename,flag,mode) char *filename; int flag,mode; Funkciya open vypolnyaet otkrytie ukazannogo fajla v sootvetstvii so zna- 408 cheniem parametra flag. Znachenie parametra flag predstavlyaet soboj kombinaciyu iz sleduyushchih razryadov (prichem iz pervyh treh razryadov mozhet byt' ispol'zovan tol'ko odin): O_RDONLY otkryt' tol'ko dlya chteniya O_WRONLY otkryt' tol'ko dlya zapisi O_RDWR otkryt' dlya chteniya i zapisi O_NDELAY esli fajl yavlyaetsya special'nym fajlom ustroj- stva, funkciya vozvrashchaet upravlenie, ne dozhida- yas' otvetnogo signala; esli fajl yavlyaetsya poime- novannym kanalom, funkciya v sluchae neudachi vozvrashchaet upravlenie nemedlenno (s indikaciej oshibki, kogda bit O_WRONLY ustanovlen), ne dozhi- dayas' otkrytiya fajla drugim processom O_APPEND dobavlyaemye dannye zapisyvat' v konec fajla O_CREAT esli fajl ne sushchestvuet, sozdat' ego; rezhim soz- daniya (mode) imeet tot zhe smysl, chto i v funkcii creat; esli fajl uzhe sushchestvuet, dannyj flag ig- noriruetsya O_TRUNC ukorotit' dlinu fajla do 0 O_EXCL esli etot bit i bit O_CREAT ustanovleny i fajl sushchestvuet, funkciya ne budet vypolnyat'sya; eto tak nazyvaemoe "monopol'noe otkrytie" Funkciya open vozvrashchaet deskriptor fajla dlya posleduyushchego ispol'zovaniya v drugih sistemnyh funkciyah. rause ______________________________ pause() Funkciya pause priostanavlivaet vypolnenie tekushchego processa do polucheniya signala. ripe ______________________________ pipe(fildes) int fildes[2]; Funkciya pipe vozvrashchaet deskriptory chteniya i zapisi (sootvetstvenno, v fildes[0] i fildes[1]) dlya dannogo kanala. Dannye peredayutsya cherez kanal v poryadke postupleniya; odni i te zhe dannye ne mogut byt' prochitany dvazhdy. rlock ______________________________ #include plock(op) int op; Funkciya plock ustanavlivaet i snimaet blokirovku oblastej processa v pa- myati v zavisimosti ot znacheniya parametra op: 409 PROCLOCK zablokirovat' v pamyati oblasti komand i dannyh TXTLOCK zablokirovat' v pamyati oblast' komand DATLOCK zablokirovat' v pamyati oblast' dannyh UNLOCK snyat' blokirovku vseh oblastej rrofil ______________________________ profil(buf,size,offset,scale) char *buf; int size,offset,scale; Funkciya profil zaprashivaet u yadra profil' vypolneniya processa. Parametr buf opredelyaet massiv, nakaplivayushchij chislo kopij processa, vypolnyayushchihsya v raznyh adresah. Parametr size opredelyaet razmer massiva buf, offset - na- chal'nyj adres uchastka profilirovaniya, scale - koefficient masshtabirovaniya. rtrase ______________________________ ptrace(cmd,pid,addr,data) int cmd,pid,addr,data; Funkciya ptrace daet tekushchemu processu vozmozhnost' vypolnyat' trassirovku drugogo processa, imeyushchego identifikator pid, v sootvetstvii so znacheniem parametra cmd: 0 razreshit' trassirovku potomku (po ego ukazaniyu) 1,2 vernut' slovo, raspolozhennoe po adresu addr v prost- ranstve trassiruemogo processa s identifikatorom pid 3 vernut' slovo, raspolozhennoe v prostranstve trassiru- emogo processa po adresu so smeshcheniem addr 4,5 zapisat' znachenie po adresu addr v prostranstve tras- siruemogo processa 6 zapisat' znachenie po adresu so smeshcheniem addr 7 zastavit' trassiruemyj process vozobnovit' svoe vy- polnenie 8 zastavit' trassiruemyj process zavershit' svoe vypol- nenie 9 mashinno-zavisimaya komanda - ustanovit' v slove sosto- yaniya programmy bit dlya otladki v rezhime poshagovogo vypolneniya read ______________________________ read(fildes,buf,size) int fildes; char *buf; int size; Funkciya read vypolnyaet chtenie iz fajla s deskriptorom fildes v pol'zova- tel'skij bufer buf ukazannogo v parametre size kolichestva bajt. Funkciya voz- vrashchaet chislo fakticheski prochitannyh bajt. Esli fajl yavlyaetsya special'nym fajlom ustrojstva ili kanalom i esli v vyzove funkcii open byl ustanovlen bit O_NDELAY, funkciya read v sluchae otsutstviya dostupnyh dlya chteniya dannyh 410 vozvratit upravlenie nemedlenno. semctl ______________________________ #include #include #include semctl(id,num,cmd,arg) int id,num,cmd; union semun { int val; struct semid_ds *buf; ushort *array; } arg; Funkciya semctl vypolnyaet ukazannuyu v parametre cmd operaciyu nad ochered'yu semaforov s identifikatorom id. GETVAL vernut' znachenie togo semafora, na kotoryj ukazy- vaet parametr num SETVAL ustanovit' znachenie semafora, na kotoryj ukazyva- et parametr num, ravnym znacheniyu arg.val GETPID vernut' identifikator processa, vypolnyavshego pos- lednim funkciyu semop po otnosheniyu k tomu semafo- ru, na kotoryj ukazyvaet parametr num GETNCNT vernut' chislo processov, ozhidayushchih togo momenta, kogda znachenie semafora stanet polozhitel'nym GETZCNT vernut' chislo processov, ozhidayushchih togo momenta, kogda znachenie semafora stanet nulevym GETALL vernut' znacheniya vseh semaforov v massive arg.array SETALL ustanovit' znacheniya vseh semaforov v sootvetstvie s soderzhimym massiva arg.array IPC_STAT schitat' strukturu zagolovka semafora s identifi- katorom id v bufer arg.buf IPC_SET ustanovit' znacheniya peremennyh sem_perm.uid, sem_perm.gid i sem_perm.mode (mladshie 9 razryadov struktury sem_perm) v sootvetstvii s soderzhimym bufera arg.buf IPC_RMID udalit' semafory, svyazannye s identifikatorom id, iz sistemy Parametr num vozvrashchaet na kolichestvo semaforov v obrabatyvaemom nabore. Struktura semid_ds opredelena sleduyushchim obrazom: struct semid_ds { struct ipc_perm sem_perm; /* struktura, opisyva- yushchaya prava dostu- pa */ int * pad; /* ispol'zuetsya siste- moj */ ushort sem_nsems; /* kolichestvo semafo- rov v nabore */ time_t sem_otime; /* vremya vypolneniya poslednej operacii nad semaforom */ 411 time_t sem_ctime; /* vremya poslednego izmeneniya */ }; Struktura ipc_perm imeet tot zhe vid, chto i v funkcii msgctl. semget ______________________________ #include #include #include semget(key,nsems,flag) key_t key; int nsems,flag; Funkciya semget sozdaet massiv semaforov, korrespondiruyushchij s parametrom key. Parametry key i flag imeyut tot zhe smysl, chto i v funkcii msgget. semor ______________________________ semop(id,ops,num) int id,num; struct sembuf **ops; Funkciya semop vypolnyaet nabor operacij, soderzhashchihsya v strukture ops, nad massivom semaforov, svyazannyh s identifikatorom id. Parametr num soder- zhit kolichestvo zapisej, sostavlyayushchih strukturu ops. Struktura sembuf oprede- lena sleduyushchim obrazom: struct sembuf { short sem_num; /* nomer semafora */ short sem_op; /* tip operacii nad semaforom */ short sem_flg; /* flag */ }; Peremennaya sem_num soderzhit ukazatel' v massive semaforov, associirovan- nyj s dannoj operaciej, a peremennaya sem_flg - flagi dlya dannoj operacii. Peremennaya sem_op mozhet prinimat' sleduyushchie znacheniya: otricatel'noe esli summa znacheniya semafora i znacheniya sem_op >= 0, znachenie semafora izmenyaetsya na velichinu sem_op; v protivnom sluchae, funkciya priostanavlivaet svoe vypolnenie, esli eto razresheno flagom polozhitel'noe uvelichit' znachenie semafora na velichinu sem_op nulevoe esli znachenie semafora ravno 0, prodol- zhit' vypolnenie; v protivnom sluchae, pri- ostanovit' vypolnenie, esli eto razresha- etsya flagom Esli dlya dannoj operacii v peremennoj sem_flg ustanovlen flag IPC_NOWAIT, funkciya semop vozvrashchaet upravlenie nemedlenno v teh sluchayah, kogda ona dolzhna byla by priostanovit'sya. Esli ustanovlen flag SEM_UNDO, 412 vosstanavlivaetsya predydushchee znachenie semafora (sem_op vychitaetsya iz tekushchej summy tipov operacij). Kogda process zavershitsya, znachenie semafora budet uvelicheno na etu summu. Funkciya semop vozvrashchaet znachenie poslednej operacii nad semaforom. setpgrr ______________________________ setpgrp() Funkciya setpgrp priravnivaet znachenie identifikatora gruppy, k kotoroj prinadlezhit tekushchij process, znacheniyu identifikatora samogo processa i vozv- rashchaet novoe znachenie identifikatora gruppy. setuid ______________________________ setuid(uid) int uid; setgid(gid) int gid; Funkciya setuid ustanavlivaet znacheniya fakticheskogo i ispolnitel'nogo ko- dov identifikacii pol'zovatelya tekushchego processa. Esli vyzyvayushchij process ispolnyaetsya pod upravleniem superpol'zovatelya, funkciya sbrasyvaet znacheniya ukazannyh kodov. V protivnom sluchae, esli fakticheskij kod identifikacii pol'zovatelya imeet znachenie, ravnoe znacheniyu uid, funkciya setuid delaet rav- nym etomu znacheniyu i ispolnitel'nyj kod identifikacii pol'zovatelya. To zhe samoe proishodit, esli znacheniyu uid raven kod, sohranennyj posle vypolneniya setuid-programmy, zapuskaemoj s pomoshch'yu funkcii exec. Funkciya setgid imeet tot zhe smysl po otnosheniyu k analogichnym gruppovym kodam. shmctl ______________________________ #include #include #include shmctl(id,cmd,buf) int id,cmd; struct shmid_ds *buf; Funkciya shmctl vypolnyaet razlichnye operacii nad oblast'yu razdelyaemoj pa- myati, associirovannoj s identifikatorom id. Struktura shmid_ds opredelena sleduyushchim obrazom: struct shmid_ds { struct ipc_perm shm_perm; /* struktura, opisyvayu- shchaya prava dostupa */ int shm_segsz; /* razmer segmenta */ int * pad1; /* ispol'zuetsya siste- moj */ ushort shm_lpid; /* identifikator pro- cessa, svyazannogo s 413 poslednej operaciej nad oblast'yu */ ushort shm_cpid; /* identifikator pro- cessa-sozdatelya */ ushort shm_nattch; /* kolichestvo prisoedi- nenij k processam */ short pad2; /* ispol'zuetsya siste- moj */ time_t shm_atime; /* vremya poslednego prisoedineniya */ time_t shm_dtime; /* vremya poslednego otsoedineniya */ time_t shm_ctime; /* vremya poslednego vneseniya izmene- nij */ }; Operacii: IPC_STAT prochitat' v bufer buf soderzhimoe zagolovka ob- lasti, associirovannoj s identifikatorom id IPC_SET ustanovit' znacheniya peremennyh shm_perm.uid, shm_perm.gid i shm_perm.mode (9 mladshih razrya- dov struktury) v zagolovke oblasti v sootvets- tvii s soderzhimym bufera buf IPC_RMID udalit' iz sistemy oblast' razdelyaemoj pamyati, associirovannoj s identifikatorom id shmget ______________________________ #include #include #include shmget(key,size,flag) key_t key; int size,flag; Funkciya shmget obrashchaetsya k oblasti razdelyaemoj pamyati ili sozdaet ee. Parametr size zadaet razmer oblasti v bajtah. Parametry key i flag imeyut tot zhe smysl, chto i v funkcii msgget. shmor ______________________________ #include #include #include shmat(id,addr,flag) int id,flag; char *addr; shmdt(addr) char *addr; 414 Funkciya shmat prisoedinyaet oblast' razdelyaemoj pamyati, associirovannuyu s identifikatorom id, k adresnomu prostranstvu processa. Esli parametr addr imeet nulevoe znachenie, yadro samo vybiraet dlya prisoedineniya oblasti podho- dyashchij adres. V protivnom sluchae ono pytaetsya prisoedinit' oblast', ispol'zuya v kachestve znachenie parametra addr v kachestve adresa. Esli v parametre flag ustanovlen bit SHM_RND, yadro v sluchae neobhodimosti okruglyaet adres. Funkciya shmat vozvrashchaet adres, po kotoromu oblast' prisoedinyaetsya fakticheski. Funkciya shmdt otsoedinyaet oblast' razdelyaemoj pamyati, prisoedinennuyu ra- nee po adresu addr. signal ______________________________ #include signal(sig,function) int sig; void (*func)(); Funkciya signal daet tekushchemu processu vozmozhnost' upravlyat' obrabotkoj signalov. Parametr sig mozhet prinimat' sleduyushchie znacheniya: SIGHUP "zavisanie" SIGINT preryvanie SIGQUIT prekrashchenie raboty SIGILL zapreshchennaya komanda SIGTRAP vnutrennee preryvanie, svyazannoe s trassirovkoj SIGIOT instrukciya IOT SIGEMT instrukciya EMT SIGFPE osobaya situaciya pri rabote s chislami s plavayushchej zapyatoj SIGKILL udalenie iz sistemy SIGBUS oshibka v shine SIGSEGV narushenie segmentacii SIGSYS nedopustimyj argument v vyzove sistemnoj funkcii SIGPIPE zapis' v kanal pri otsutstvii schityvayushchih processov SIGALRM signal trevogi SIGTERM zavershenie programmy SIGUSR1 signal, opredelyaemyj pol'zovatelem SIGUSR2 vtoroj signal, opredelyaemyj pol'zovatelem SIGCLD gibel' potomka SIGPWR otkaz pitaniya Parametr function interpretiruetsya sleduyushchim obrazom: SIG_DFL dejstvie po umolchaniyu. Oznachaet zavershenie pro- cessa v sluchae postupleniya lyubyh signalov, za is- klyucheniem SIGPWR i SIGCLD. Esli signal imeet tip SIGQUIT, SIGILL, SIGTRAP, SIGIOT, SIGEMT, SIGFPE, SIGBUS, SIGSEGV ili SIGSYS, sozdaetsya fajl "core", soderzhashchij damp obraza processa v pamyati SIG_IGN ignorirovat' postuplenie signala funkciya adres procedury v prostranstve processa. Po voz- vrashchenii v rezhim zadachi proizvoditsya obrashchenie k ukazannoj funkcii s peredachej ej nomera signala v kachestve argumenta. Esli signal imeet tip, otlich- nyj ot SIGILL, SIGTRAP i SIGPWR, yadro avtomati- cheski pereustanavlivaet imya programmy obrabotki signala v SIG_DFL. Signaly tipa SIGKILL processom ne obrabatyvayutsya 415 .te1 stat ______________________________ stat(filename,statbuf) char *filename; struct stat *statbuf; fstat(fd,statbuf) int fd; struct stat *statbuf; Funkciya stat vozvrashchaet informaciyu o statuse (sostoyanii) ukazannogo faj- la. Funkciya fstat vypolnyaet to zhe samoe v otnoshenii otkrytogo fajla, imeyushche- go deskriptor fd. Struktura statbuf opredelena sleduyushchim obrazom: struct stat { dev_t st_dev; /* nomer ustrojstva, na kotorom na- hoditsya fajl */ ino_t st_ino; /* nomer indeksa */ ushort st_mode; /* tip fajla (sm. mknod) i prava dostupa k nemu (sm. chmod) */ short st_nlink; /* chislo svyazej, ukazyvayushchih na fajl */ ushort st_uid; /* kod identifikacii vladel'ca fajla */ ushort st_gid; /* kod identifikacii gruppy */ dev_t st_rdev; /* starshij i mladshij nomera ustrojstva */ off_t st_size; /* razmer v bajtah */ time_t st_atime; /* vremya poslednego obrashcheniya */ time_t st_mtime; /* vremya poslednego vneseniya izmenenij */ time_t st_ctime; /* vremya poslednego izmeneniya statusa */ }; stime ______________________________ stime(tptr) long *tptr; Funkciya stime ustanavlivaet sistemnoe vremya i datu v sootvetstvie so znacheniem, ukazannym v parametre tptr. Vremya ukazyvaetsya v sekundah ot 00:00:00 1 yanvarya 1970 goda po Grinvichu. syps ______________________________ sync() Funkciya sync vygruzhaet soderzhashchuyusya v sistemnyh buferah informaciyu (ot- nosyashchuyusya k fajlovoj sisteme) na disk. time ______________________________ time(tloc) 416 long *tloc; Funkciya time vozvrashchaet sistemnoe vremya v sekundah ot 00:00:00 1 yanvarya 1970 goda po Grinvichu. times ______________________________ #include #include times(tbuf) struct tms *tbuf; Funkciya times vozvrashchaet vremya v tajmernyh tikah, real'no proshedshee s lyubogo proizvol'nogo momenta v proshlom, i zapolnyaet bufer tbuf sleduyushchej uchetnoj informaciej: struct tms { time_t tms_utime; /* prodolzhitel'nost' ispol'zova- niya CP v rezhime zadachi */ time_t tms_stime; /* prodolzhitel'nost' ispol'zova- niya CP v rezhime yadra */ time_t tms_cutime; /* summa znachenij tms_utime i tms_cutime u potomkov */ time_t tms_sutime; /* summa znachenij tms_stime i tms_sutime u potomkov */ }; ilimit ______________________________ ulimit(cmd,limit) int cmd; long limit; Funkciya ulimit daet processu vozmozhnost' ustanavlivat' razlichnye ograni- cheniya v zavisimosti ot znacheniya parametra cmd: 1 vernut' maksimal'nyj razmer fajla (v blokah po 512 bajt), v kotoryj process mozhet vesti zapis' 2 ustanovit' ogranichenie sverhu na razmer fajla ravnym znacheniyu para- metra limit 3 vernut' znachenie verhnej tochki preryvaniya (maksimal'nyj dostupnyj adres v oblasti dannyh) imask ______________________________ umask(mask) int mask; Funkciya umask ustanavlivaet znachenie maski, opisyvayushchej rezhim sozdaniya fajla (mask), i vozvrashchaet staroe znachenie. Pri sozdanii fajla bity razreshe- niya dostupa, kotorym sootvetstvuyut ustanovlennye razryady v mask, budut sbro- sheny. 417 imount ______________________________ umount(specialfile) char *specialfile Funkciya umount vypolnyaet demontirovanie fajlovoj sistemy, raspolozhennoj na ustrojstve vvoda-vyvoda blokami specialfile. ipame ______________________________ #include uname(name) struct utsname *name; Funkciya uname vozvrashchaet informaciyu, identificiruyushchuyu sistemu v sootvet- stvii so sleduyushchej strukturoj: struct utsname { char sysname[9]; /* naimenovanie */ char nodename[9]; /* imya setevogo uzla */ char release[9]; /* informaciya o versii sistemy */ char version[9]; /* dopolnitel'naya informaciya o versii */ char machine[9]; /* tehnicheskij kompl