linux sistem programlama

Upload: poliptol

Post on 31-May-2018

285 views

Category:

Documents


1 download

TRANSCRIPT

  • 8/14/2019 Linux Sistem Programlama

    1/171

  • 8/14/2019 Linux Sistem Programlama

    2/171

    C ve Sistem Programclar Dernei 2

    18-07-02

    UNIX Grubu letim Sistemlerinin Tarihsel Geliimi

    UNIX iletim sisteminin tarihi 1968-69 senelerine dayanr. C programlama dili UNIX iletim

    sisteminin gelitirilmesi sresinde tasarlanmtr. 1968 ylnda AT&Tden K.Thombson,D.Ritchie ve B.Kernighan Multics isimli bir iletim sistemi projesine baladlar. Multicsprojesi MIT gibi niversitelerle ortak olarak yrtlyordu. Ancak Multics projesinin eitliproblemlerinden dolay 1969 ylnda AT&T projeden ayrlma karar vermitir. 1969 ylndaekip yeni bir iletim sistemi yazma projesine balamtr. 1970 ylnda B.Kernighan bu yeniiletim sistemini Multicsten kelime oyunu yaparak UNIX ismini vermitir.

    UNIX iletim sistemi 1970 ylnda DECin PDP-7 makinelerinde yazlmtr. UNIXin bu ilkversiyonu tamamen sembolik makine dilinde yazlmtr. Yalnzca iletim sisteminin ekirdekksm deil, tm yardmc programlar da sembolik makine dilinde yazlmlardr.K.Thombson bu yeni iletim sistemi iin nceleri Fortran derleyicisi yazmaya niyetlendiyse

    de daha sonra tamamen yeni bir araya gemitir. K.Thombson BCPL dilinden esinlenerekalak seviyeli ilemlerde kullanlabilecek B programlama dilini tasarlam ve derleyicisiniyazmtr. B her yn ile tanmlanm bir programlama dili deildir. Ancak alma ekibinisembolik makine dilinden kurtarmtr. D.Ritchie bu sre ierisinde B programlama dilinigelitirerek bugn kullandmz C programlama dilini tasarlam ve derleyicisini yazmtr(1971).

    1973 ylnda ekip DECin PDP-11 makineleri iin UNIX iletim sistemini tamamen Cprogramlama dilini kullanarak yeniden yazmtr. Bu zellii ile UNIX sembolik makinedilinde yazlmayan ilk iletim sistemi olmutur. Bu durum iletim sisteminin kaynakkodlarnn tanabilmesini salam ve UNIX iletim sisteminin DEC makinelerinin dnda

    da alabilmesine n ayak olmutur.

    UNIX iletim sisteminin kaynak kodlar pek ok aratrma gurubuna nceleri cret talepedilmeden verilmitir. Bunun sonucu olarak bu rnn gelitirilip pek ok farkl UNIXiletim sistemlerinin olumasna neden olmutur. Bunlarn en nls Berkeley tarafndangelitirilmi olan BSD versiyonlardr (Berkeley Software Distribution). BSDversiyonlarndan serbest olarak datlmtr (Free BSD, Net BSD, Open BSD). ZamanlaAT&Tnin orijinal UNIX sistemleri ile Berkeleyin sistemlerinde rekabet olumusa daAT&Tnin sistemleri stnlk kazanmtr. AT&T, UNIX sistemlerine bir versiyon numarasvermitir. Ayrca bu sistemler nce System3 daha sonra da System5 biimindeisimlendirilmitir. UNIX grubu sistemlerin temel referans System5tir.

    AT&T 80li yllarda UNIX sistemlerine telif uygulama karar almtr. Bu durumniversitelileri tedirgin etmitir, nk niversitelerde bilgisayar aratrmalarnda hepUNIXin kaynak kodlar kullanlyordu. Bunun zerine Hollandal bir profesr olan AndrewTanenbaum kendi derslerinde kullanabilecei kk bir UNIX sistemi yazmtr. Bu iletimsistemi Minix diye isimlendirilmitir.

    1984 ylnda Richard Stallman serbest yazlm fikrini ortaya atarak FSF (Free SoftwareFoundation) diye bilinen birlii kurmutur. Amac tamamen serbest ve bedava olacak bir eitUNIX sistemi yazmakt (www.fsf.org www.gnu.org). GNU projesi kapsamnda pek ok

    yardmc yazlm gelitirilmitir. rnein bu gn Linux sistemlerinde kullanlan gccderleyicisi ve imacs editr bu proje kapsamnda gelitirilmitir. Ancak Richard Stallman ve

    http://www.fsf.org/http://www.fsf.org/http://www.gnu.org/http://www.gnu.org/http://www.fsf.org/
  • 8/14/2019 Linux Sistem Programlama

    3/171

    C ve Sistem Programclar Dernei 3

    FSF kurumu yardmc aralar gelitirdiyse de iletim sisteminin kendisini tamamen gelitiripbitirememitir. Serbest yazlm (Free Software) bedava yazlmdan ziyade bakasnnoluturduu bir yazlm hi izin almadan gelitirmek anlamndadr. Bu kavramda kiiprogramn satabilir, ama kaynak kodu zerinde bir hakka sahip olamaz, yani onusahiplenemez. Bunun iin GNU Public License gelitirilmitir.

    1991 senesine gelindiinde GNU projesine ilikin pek ok ey yazlmtr. Ama iletimsisteminin ekirdei yazlmamtr. te Linus Torwalds, ismine Linux dedii bir ekirdekyazarak GNU projesini tamamlamtr. Bugn Linuxun pek ok srm vardr, fakat busrmlerin hepsi ayn ekirdei kullanmaktadr. GNU/Linux sistemleri Intel makinelerinindnda baka donanmlara da aktarlmtr.

    1980 yllarn sonlarna doru UNIX sistemleri kendi aralarnda tanabilir yaplmayaallmtr. Bylelikle bir UNIX sistemi iin yazlm kaynak kodun baka bir UNIXsisteminde de problemsiz derlenerek altrlabilecei dnlmtr. Byle birstandardizasyon Richard Stallman tarafndan nerilmitir. Standartlama ile IEEE ilgilenmi

    ve 1003 numaral standardizasyon ekipleri kurulmutur. Bu standartlar POSIX (PortableOperating System Interface for UNIX) biiminde isimlendirilmitir. rnein 1003.1 ya daPOSIX.1 UNIX sistemlerindeki sistem fonksiyonlarnn neler olmas gerektiini belirler.Dier alt gruplar baka ilevsel zellikler konusunda belirlemeler oluturmutur. Bu gnkullanlan UNIX ve Linux sistemlerinin hemen hepsi burada belirtilen POSIX standartlar nauygundur. POSIX aslnda IEEE tarafndan yalnzca UNIX sistemlerine zg bir standartolarak ele alnmamtr. UNIX gurubu dndaki iletim sistemleri de isterlerse POSIXstandartlarna uyum salayabilirler. rnein NT gurubu sistemlerin POSIX alt yaps vardrve POSIXi desteklemektedirler.

    UNIX Sistemine Giri ve Temel Kavramlar

    Temel olarak UNIX/Linux sistemleri monolitik bir yapya sahiptir. Monolitik sistemlerdeiletim sisteminin ekirdek ksm byktr ve neredeyse tek para halindedir. Bu trsistemlerde sisteme ekleme yapmak zordur ve tm ekirdein yeniden derlenmesinigerektirmektedir. Monolitik yapnn tersi mikro kernel teknolojisidir. Mikro kernelsistemlerde iletim sisteminin ekirdei kk tutulur. letim sisteminin pek ok fonksiyonugerektiinde sonradan yklenilebilen modller halinde tasarlanr. Bu tr sistemlerde iletimsisteminin geniletilmesi bakalar tarafndan daha kolay yaplr, ancak tasarmlar ayrntl vezordur. Win32 sistemleri tipik olarak mikro kernel sistemi ile tasarlanmtr.

    UNIX sistemleri yklendiinde ekirdek tarafndan oluturulmu bir process login programnaltrr. Bylece sisteme girecek kii bir login ekranyla karlar. Login ekran ilekarlaldnda iletim sistemi yklenmitir ve o anda login program almaktadr. loginprogram kullancdan bir kullanc ismi ve password ister ve bunun doruluunu kontrol ederve daha nce belirlenen bir program o kullanc iin altrr. Sisteme girdikten sonrakullanc iin altrlacak program genellikle bir komut yorumlayc programdr. Bylecesisteme girildikten sonra kullanc bir komut yorumlayc ile karlalr. UNIX sistemlerindekomut yorumlayclar (command interpreter / shell) bir tane deildir. Bir kullanc sistemegirdiinde hangi komut yorumlaycnn altrlaca ve kullancya ilikin dier bilgiler,kullanc yaratlrken belirlenir ve korunmu olan baz dosyalarn ierisinde saklanr. UNIX

    sistemleri bir sper kullancnn her trl ilemi yapabilecei bir sistemdir. Sper kullancnn

  • 8/14/2019 Linux Sistem Programlama

    4/171

    C ve Sistem Programclar Dernei 4

    kullanc ismi root biimindedir. Sisteme sper kullanc olarak giren birisi hibir gvenlikengeline taklmadan sistemle ilgili her trl ilemleri yapabilir. Her trl dosyaya eriebilir.

    UNIX/Linux Sistemlerinde Kullanlan Komut Yorumlayc (Shell) Programlar

    UNIX/Linux sistemlerinde komut yorumlayc programlar iletim sisteminin ekirdekksmndan ayrdr ve birden fazladr. Login ilemi ile birlikte sisteme girildiinde hangikomut yorumlayc programn (shell) altrlaca kullanc yaratlrken belirtilmektedir.UNIX/Linux sistemlerinde en yaygn olarak kullanlan komut yorumlayc programlarunlardr:

    1) C Shell (csh)2) Bourne Shell (bsh)3) Bourne Again Shell (bash)4) Korne Shell (ksh)

    Bu komut yorumlayc programlar arasnda baz komut farkllklar, script dillerinde eitlifarkllklar vardr. Bunlardan en yaygn kullanlan Linuxta bashtir. UNIX sistemlerinde CShell de yaygn olarak kullanlmaktadr. Kukusuz komut yorumlayclar birer sistemprogramlardr ve yeni komut yorumlayclar yazlabilir. Kullanc login olduunda bakakiiler tarafndan yazlm komut yorumlayclar ile de alabilir. Komut yorumlayclariletim sistemi iin sradan birer processtir. Shell programndan kmak iin (shellprogramndan kldnda yeniden login programnda geri dnlr.) uygun bir shell komutugirmek gerekir. Bu shell komutunun ismi genel olarak logouttur.

    UNIX/Linux sistemlerinde isel komut kavram yoktur. Btn komutlar aslnda birer

    alabilen dosyadr. Dolays ile her trl komut yorumlaycda bu komutlar almaktadr.

    UNIX/Linux Dosya Sistemine likin Temel Dizinler

    UNIX/Linux sistemlerinin dizin yaps DOSta grdmz yapya ok benzerdir. Ancakdizin geileri \ ile deil / ile yaplr. Kk dizin tek bir / ile temsil edilir. Path sistemininoluturulmas ayndr. Ancak UNIX/Linux sistemlerinde src kavram yoktur. Bu sistemlerbaka dosya sistemlerini kullanabilmektedir, ama baka dosya sistemleri mount ilemindensonra dizin aacnda bir dizin biiminde monte edilmektedir. rnein ierisinde Windowsykl olan bir makineye ayrca Linux kurduumuzu dnelim. Linux ierisindeWindowstaki C, D ve E srclerine erimek isteyelim. Bu srcler Linux dizin aacnnistenilen bir yerine bir dizin gibi monte edilirler. Sonra biz bu dizinlere getiimizde aslndaWindowstaki srclerin kk dizinlerine gemi oluruz. Baka bir dosya sisteminiUNIX/Linux sistemlerine monte etme ilemlerine mount ilemi denir.

    Tipik bir UNIX/Linux sistemi kurulduunda kurulum programlar tarafndan bir dizin aacoluturulur ve dizinlere uygun programlar yerletirilir. Tabii bu dizin aalar sistemdensisteme deiebilmektedir ve standart deildir. Ancak pek ok sistemde aadaki gibidir:

  • 8/14/2019 Linux Sistem Programlama

    5/171

    C ve Sistem Programclar Dernei 5

    /bin dizini alabilen dosyalar ve sistem komutlarn barndrr./dev dizini aygt dosyalar iin ayrlmtr./etc dizini nemli sistem dosyalarn tutar./lib dizini ktphane dosyalarn barndrr./home dizini kullanclar iin default dizinlerin kk dizinidir./mnt dizini mount ilemleri iin dnlmtr./usr dizini eitli programlar tarafndan kullanlan bir dizindir./tmp geici dosyalarn yaratld dizin olarak kullanlr.Tabii kurulum ilemi ile bu aa bymektedir.

    UNIX/Linux Sistemlerinin Kurulumu

    UNIX/Linux sistemlerinin kurulumu maalesef Windows sistemlerinden daha zordur. Pek oksistemi kurmadan nce boot ve root disketlerinin oluturulmas gerekir ve kuruluma budisketlerle balamak gerekir. Bu disketler Windows ya da DOS ortamndahazrlanabilmektedir. Bu tr sistemlerde makine boot disketi taklarak disketten alr. Sonraroot disketinin taklmas istenir ve sonra da bir prompt ile karlalr. Bu aamada setupprogram altrlarak kuruluma balanr. Ancak UNIX/Linux sistemlerinin ounda kurulumilemleri kolaylatrlmtr. rnein dorudan makine CDden boot edilerek kurulum

    balatlabilir. UNIX/Linux sistemleri ayr bir patitiona kurulmaldr.

    UNIX/Linux sistemlerinin eski versiyonlarnn ou PClere kurulduunda disk blmlemetablosunun (partition table) ana drtlk girilerinden birini kullanmak ister. Bu sistemler tekbalarna yklendiinde genellikle problemsiz bir biimde kurulur. Ancak genelliklemakinede zaten bir Windows sistemi vardr ve bu sistemler ikinci bir iletim sistemi olarakyklenmek istenir. Bu durumda zellikle extended partition yaratrken, enxtended partitionundiskin geri kalan tm alan kullanmas yoluna gidilmemelidir. Yani geri kalan ana giriler iinyer braklmaldr. Eer tm disk extended partition iin kullanlmsa extended partitionklterek yer aan zel programlar vardr (fibs, partition resizer). Ana giriler iin yeraldktan sonra yeni bir UNIX/Linux partition yaratlr. Bu partition iin UNIX/Linuxformat atldktan sonra kurulum problemsiz olarak devam eder.

    Ancak bu sistemlerin son versiyonlar extended partitionn logical srcleri zerine dekurulabilmektedir. Yani rnein diskin tamamn extended partition olarak kullanm olalmve extended partition ierisindeki mantksal srcler D, E, F, G olsun. rnein G srcsfeda edilerek sistem G srcs zerine de kurulabilir.

    letim sisteminin kurulmasndan sonra en nemli problem makine aldnda sisteministenilen iletim sistemi ile boot edilebilmesidir. Yani makineyi atmzda bir yaz kacak,biz de istediimiz iletim sistemi ile almaya balayabileceiz. Bu ilem iin Linux

    sistemlerindeki Lilo program kullanlabilir ya da zel boot yneticisi programlarla bu ilemyaplabilir. Lilo program zaten kurulumun son aamasnda bu ilemi yapmak zere devreye

    /bin /dev /etc /lib /home/mnt

    /usr /tmp

  • 8/14/2019 Linux Sistem Programlama

    6/171

  • 8/14/2019 Linux Sistem Programlama

    7/171

    C ve Sistem Programclar Dernei 7

    Bu komut o anda allan dizinin hangisi olduunu grntler.

    rm ve cp Komutlar

    Bu komutlar DOS'daki del ve copy komutlar gibidir.

    more Komutu

    Sayfa sayfa type etmekte kullanlr.

    mkdir ve rmdir Komutlar

    Dizin yaratp dizin silmek iin kullanlr.

    cd Komutu

    Dizin deitirir.

    UNIX/Linux Sistemlerinin Dosya Sistemine likin Temel Bilgiler

    POSIX dosya sisteminde dosya isimlerinin byk/kk harf duyarll vardr. rnein,ankara isimli dosyayla Ankara isimli dosya ayn anda bulunabilir ve birbirlerinden farkldr.Bu dosya sistemi de FAT sisteminde olduu gibi bir kk dizin ve i ie gemi dizinlertopluluundan oluur.

    POSIX sistemlerinde orta karmaklkta bir koruma mekanizmas uygulanmtr, yani

    dosyalar ve dizinler bunlar yaratanlarn isteiyle dier kullanclardan gizlenebilmektedir.Her dosya ve dizine eriim durum dikkate alnarak deerlendirilmektedir:

    1) Eriimi dosyay yaratan kii mi yapmaya almaktadr?2) Eriim dosyay yaratan kullancnn dahil olduu gruptan herhangi bir kullanc tarafndanm yaplmak istenmektedir? eitli kullanclar bir grup altnda toplanabilir. Yani eriimdedosyay yaratan kii olmann yan sra yaratan kii ile ayn grupta olmann da nemi vardr.3) Eriimi ne dosyay yaratan kii ne de dosyay yaratan kii ile ayn grupta olan bir kii miyapmaya almaktadr, yani herhangi bir kullanc m yapmaya almaktadr?

    te bir dosyaya ya da dizine eriimde bu ltlere dikkat edilmektedir. POSIX sisteminde herdosyann onu yaratan kii (owner), yaratan kiinin grubu ve herhangi bir kii iin eriimhaklar vardr. Yani her dosya iin o dosya zerinde kimin hangi ilemleri yapacabelirlenmitir.

    Bir dosya zerinde eriim ilemi yaplabilir: okuma, yazma ve altrma. Bir dosyanneriim bilgilerini grmenin en kolay yolu ls -l komutunu uygulamaktr. Bu komutuygulandnda dosyann tipik eriim bilgisi aadaki gibi olur:

    -rw-rw-rw-

    Bu eriim bilgisindeki en soldaki karakter dosyann trn belirtir. rnein bu karakter - isedosya sradan bir dosyadr, d ise bir dizin, p ise bir pipe vs... Sonraki karakterler erli

  • 8/14/2019 Linux Sistem Programlama

    8/171

    C ve Sistem Programclar Dernei 8

    gruplara ayrlr. lk grup dosyay yaratan kii iin, sonraki grup dosyay yaratan kiinin grubuiin, sonraki grup ise herhangi bir kii iin eriim haklarn belirtmektedir. rnein,

    d rwx rwx rwxsahibi grup herhangi birisi

    rnein bir dosyann eriim bilgileri yle olsun:

    -rw-r--r---,rw-,r--,r--

    Dosyay yaratan kii buradaki dosya zerinde hem okuma hem yazma yapabilir, ancakdosyay yaratan kii ile ayn gruptaki kiiler ve dier kiiler yalnzca okuma yapabilirler.

    Bir dosyann okunabilmesi demek dosya fonksiyonlaryla okuma ilemlerinin yaplabilmesidemektir. Bir dosyaya dosya fonksiyonlaryla yazma, ekleme gibi ilemlerin yaplabilmesiiin yazma hakknn olabilmesi gerekir. POSIX sistemlerinde altrlabilen dosyalaruzantlaryla tespit edilmezler, eriim haklaryla tespit edilirler. Yani dosyann x eriimzellii varsa bu dosya altrlabilir bir dosyadr. smi yazldnda iletim sistemi tarafndanyklenir. Bir dizin iin okuma hakknn olmas o dizin iin dizin listesinin alnabilmesianlamndadr. Yazma hakknn anlam o dizinde yeni bir dosya yaratma ya da olan bir dosyaysilme anlamndadr. nk aslnda dizinler de birer dosya gibidir. Dizinler iinaltrlabilme hakk tamamen farkl bir anlama gelir, bu hak bir path ifadesinde bir dizininierisinden baka bir dizine atlanabileceini belirtir. rnein, bir dosya aacak olalm vedosyann path bilgisi yle olsun:

    /a/b/c.dat

    Burada biz c.dat dosyasnn ieriini yalnzca okumak isteyelim, yani fopen() fonksiyonu ilec.dat dosyasn "r+" modunda amak isteyelim. Burada a dizininin ierisinden geilmektedir.Yani a'nn altrlabilir hakkna sahip olmas gerekir. c.dat dosyasnn okuma ve yazmahaklarna sahip olmas gerekir. b'nin okuma ve altrlabilir hakkna sahip olmas gerekir,ancak yazma hakkna sahip olmasna gerek yoktur. Dizinler iin byle bir mekanizmakurulmasnn anlam udur: Bir kii bir dizini korumak isteyebilir ama o dizinin altndakibaka bir dizini korumak istemeyebilir, bu durumda korumak istedii dizin iin okuma veyazma hakk vermez onun alt dizini iin okuma ve yazma hakk verir, ancak st dizin iingei hakkn vermesi gerekir.

    Aadaki path ile verilen fonksiyonu "w+" modunda amak isteyelim./a/b/c/d.dat

    Bu durumda a, b, c dizinleri iin x hakknn olmas gerekir, ancak a ve b iin r ve w haklarnnolmasna gerek yoktur. d.dat dosyasnn okuma ve yazma hakkna sahip olmas gerekir.Burada c dizininin hangi haklara sahip olmas gerekir? Bir dizin iin yazma hakk dizinierisinde yeni bir giri oluturmak anlamndadr. Yani yukardaki rnekte d.dat dosyas dahance varsa, yani biz truncate ilemi yapyorsak, c dizininin yazma hakkna sahip olmasnagerek yoktur. Ancak d.dat dosyas yoksa dizin ierisinde yeni bir giri oluturulacaktr, budurumda c'nin yazma hakkna sahip olmas gerekir.

    Kullanc ID Deeri

  • 8/14/2019 Linux Sistem Programlama

    9/171

    C ve Sistem Programclar Dernei 9

    Bir kullanc yaratldnda bir kullanc ismi (user name), bir password ve kullanc isminekarlk gelen bir kullanc ID deeri (user ID) belirlenmektedir. rnein kullanc ismi "kaan"ve ID'si "500" olabilir. Kullanc ID deeri 0 - 65535 arasnda sabit bir deerdir. Her ne kadarID deerinin sistem genelinde tek olmas zorunlu olmasa da kullanm bakmndan sistem

    genelinde tek olmaldr. Bir kullanc yaratldnda kullanc ismi, ID deeri ve passwordbilgisi /etc/passwd iine text dosyas olarak yazlr. /etc dizini korunmu bir dizin deildir,ancak passwd dosyas kurulum program tarafndan kurulum srasnda root kullancstarafndan yaratlm bir dosya biiminde oluturulur. passwd dosyasnn herhangi birkullanc iin sadece okuma hakk vardr. Yani passwd dosyas bir editrle incelenebilir, amaierii normal bir kullanc tarafndan deitirilemez.

    Baz sistemlerde password bilgisi ifrelenmi olarak passwd dosyas ierisinde yazmaktadr.Ancak baz sistemlerde gvenlii arttrmak iin password bilgisi okuma hakk da olmayan

    /etc/shadow dosyasnda saklanr. passwd ve shadow dosyalarnn ierii ileride ele alnacaktr.passwd ve shadow dosyalar login ilemi srasnda ve daha pek ok ilem srasnda login

    programlar tarafndan okunmaktadr. rnein passwd dosyasnda bir kullanc iinoluturulan satr root olarak girilip silinirse kullanc sisteme giri yapamaz.

    root kullancsnn ID deeri 0'dr. Pek ok sistemde 1 - 100 arasndaki deerler reserveedilmitir. Kullancnn ID deeri getuid fonksiyonuyla elde edilebilir ve eitli testilemlerinde kullanlabilir.

    Gruplarn ID Deerleri

    Kullanclarda olduu gibi her grup iin de bir grup ismi ve ID deeri vardr. Bir grup

    yaratldnda grubun ismi, ID deeri ve grup ierisindeki kullanclarn kimler olduu /etc/group dosyasnda belirtilmektedir. group dosyas da passwd dosyasnda olduu gibi roottarafndan yaratlmtr ve dier kiiler iin yalnzca okuma hakk verilmitir. Bir kullancnngrubuna ilikin ID deeri getgid fonksiyonuyla elde edilebilir.

    UNIX/Linux Process Yapsnn Temelleri

    UNIX/Linux sistemlerinin process yaps tamamen hiyerarik bir yap gstermektedir. Dieriletim sistemlerinde olduu gibi POSIX sistemlerinde de bir process baka bir programaltrabilir yani yeni bir process yaratabilir. Yeni altrlan process (child process) ile onualtran process (parent process) arasndaki iliki Windows sistemlerine gre skdr. Klasikolarak POSIX sistemlerinde her processin bir ID deeri vardr. Bu ID deeri sistemde tektir.POSIX sistemleri yklendiinde temel ykleme ilemleri iin 0 ID numarasna sahip birprocess yaratlr. Bu process init processini yaratmaktadr. init processin ID deeri 1dir.Sisteme girmek iin kullanlan login de bir programdr, yani bir process olarak altrlr.Login tipik olarak init processinin bir alt processdir (child process). Kullanc username vepassword bilgilerini baarl bir biimde girdiyse /etc/passwd dosyasnda belirtilen shellprogram altrlr.

    Yani shell processi tipik olarak login processinin alt processi olarak alr. Bu durumda

    tipik bir POSIX sisteminde sisteme login olunduunda process hiyerarisi yle olacaktr. Bunoktada artk shell zerinden bir program altrrsak alan process shell processinin bir alt

  • 8/14/2019 Linux Sistem Programlama

    10/171

    C ve Sistem Programclar Dernei 10

    processi olarak altrlacaktr. UNIX/Linux sistemlerinde bir processin yeni bir processialtrmas fork ve exec fonksiyonlar ile yaplmaktadr. Bu sistemlerde yaratlan altprocessler st processin pek ok bilgisini dorudan almaktadr. UNIX/Linux sistemlerininprocess ynetimi ileride ayrca ele alnacaktr.

    Processlerin Eriimlerde Kullandklar ID Deerleri

    Her processin eriim sisteminde kulland be tr ID deeri vardr.

    1) Gerek kullanc ID deeri (real user ID)2) Gerek grup ID deeri (real group ID)3) Etkin kullanc ID deeri (effective user ID)4) Etkin Grup ID deeri (effective group ID)5) Ek grup ID deerleri (supplementory group ID)

    Bu ID deerleri process fork ve exec fonksiyonlar ile yaratlrken dorudan st processinprocess tablosundan alnmaktadr. Bu ID deerleri yetkin processler tarafndandeitirilebilmektedir.

    Sisteme girildiinde shell processi normal olarak login processi tarafndan yaratlmtr.login processi username ve password kontroln yapp shell processini altrdktan sonra,bu processin gerek kullanc ID deerini ve gerek grup ID deerini passwd dosyasndabelirtilen deerler ile oluturur. Sonu olarak shell processinin gerek kullanc ID deeri vegerek grup ID deeri kullanc yaratlrken belirlenmi olan ID deerleri olur. Biz shellzerinde kendi yazdmz bir program altrrken aslnda shell processi komut satrndabelirtilen program yine fork ve exec fonksiyonlar ile altrr. Bu durumda altrlan

    programn gerek kullanc ve grup ID deerleri de shell processinin ayns olacaktr.

    POSIX sistemlerinde eriim kontrolleri gerek kullanc ve grup ID deerleri ile deil etkinkullanc ve grup ID deerleri ile yaplr. Normal olarak altrlan processin etkin kullancve grup ID deerleri gerek kullanc ve grup ID deerleri ile ayndr. te altrlabilenprogramlarn kullanc ve grup iin iki bayra vardr. Eer bu bayraklar set edilmi olan birdosyadan fork ve exec ilemleri ile bir process yaratlm ise yaratlan processin etkinkullanc ve grup ID deerleri o altrlabilen dosyann sahibinin ve grubunun ID deeri olur(bu bayraklarn set edilmi olup olmad ls l komutunda x yerine s harfinin grlmesindenanlalr). rnein diskte passwd isimli bir program olsun. Programn eriim haklar yleolsun:

    -rwxr-xr-x root shadow /usr/bin/passwd

    imdi eer bu dosyann kullanc ya da grup bayraklar set edilmemi ise bu programaltrldnda yaratlan processin etkin kullanc ve grup ID deerleri bizimkinin aynsolacaktr ve bu programn ierisinde baz ncelikli eriimler yaplyor ise bu eriimlerbaarsz olacaktr. te imdi eer bu dosyann kullanc ID bayra set edilmi olsa buprocessin etkin kullanc ID deeri dosyann sahibinin kullanc ID deeri yani root olacaktr.Eriim kontrolne etkin ID deerleri katld iin eriimler gerekleecektir. Grld gibialtrlabilen dosyalarn bu zel bayraklar sanki bu dosyalar dosyann sahibi gibi

    altrlmasn salamaktadr. Bu bayraklarn set edilebilmesi iin eriim hakkna sahipolmak gerekir. Bu bayraklarn set edilmesi chmod komutu ile yaplmaktadr.

  • 8/14/2019 Linux Sistem Programlama

    11/171

    C ve Sistem Programclar Dernei 11

    zetle biz root olmasak bile root istedikten sonra root tarafndan oluturulmu program rooteriim hakk ile altrabiliriz.

    UNIX/Linux sistemlerinde normal olarak bir kullanc tek bir gruba ilikin olabilir. Yani

    processin gerek grup IDsi bir tanedir. Ancak bir kullancnn birden fazla gruba ye olmasfaydal bir durum oluturduundan ek grup ID kavram ile bir kullanc birden fazla grubaaitmi gibi de gsterilebilmektedir. Her grubun hangi kullanclardan oluturulduu /etc/groupdosyasnda belirtilmitir. Bu dosyaya bakldnda bir kullancnn farkl gruplardabulunabilecei grlmektedir. Ancak kullancnn gerek grubu /etc/passwd dosyasndabelirtilen gruptur. Bir shell processi yaratld zaman processin ek grup IDleri /etc/groupdosyasndan alnarak oluturulmaktadr. zetle bir kullancnn tek bir grup IDsi vardr o da

    /etc/passwd dosyasnda belirtilendir. Ancak kullanc birden fazla gruba ilikin olabilir o da /etc/group dosyasnda belirtilmektedir. Ek grup IDleri de eriimde kontrol ileminesokulmaktadr.

    Eriim Kontrolleri

    Edinilen bilgilerden sonra POSIX sistemlerinin uygulad eriim kontrolleri sras ile elealnabilir. rnein bir processin bir dosyaya erimek istediini dnelim. Eriimalgoritmasnda gerek kullanc ve grup IDleri deil, etkin kullanc ve grup IDleri ile ekgrup IDleri test ilemine sokulmaktadr.

    1) Eriimi gerekletirmek isteyen processin etkin kullanc ID deeri 0 (root) ise eriimgerekletirilir.2) Dosyann sahibinin etkin kullanc ID deeri ile belirtilen kullanc olup olmadna

    baklr. Eer dosyann sahibi processin etkin kullanc IDsiyle belirtilen kullanc ise, bu kezdosya sahipliinin rwx alanlarna baklarak eriim hakknn olup olmad test edilir. Eriimhakk varsa eriim gerekleir, yoksa eriim reddedilir ve bir sonraki aamaya geilmez.3) Processin etkin grup IDsi ile dosyann ilikin olduu grup karlatrlr. Eer dosyaprocessin etkin grup IDsi ile belirtilen gruba ilikin ise dosyann grup eriim haklarnabaklr. Bu haklar uygunsa eriim gerekletirilir, deilse eriim reddedilir ve sonraki aamayageilmez.4) Processin ek grup IDlerinden herhangi birisi dosyann ilikin olduu gruptan m diyebaklr. Eer gruptan ise dosyann grup eriim haklar incelenir. Eriim haklar uygun iseeriim gerekletirilir. Uygun deilse eriim reddedilir ve sonraki aamaya geilmez.5) Bu aamada artk process herhangi biri durumuna gelmitir. Bu nedenle dosyannherhangi birine ilikin eriim haklarna baklr. Eer eriim hakk uygunsa eriimgerekletirilir, deilse eriim reddedilir.

    rnein aada a isimli alabilen dosyann ve b data dosyasnn bilgileri verilmitir.

    -r-sr-xr-x Ali Project1 a-r--rw-r-- Veli Project1 b

    a programnn b data dosyasna bir eyler yazmak istediini dnelim. Grubu Project3 olanMehmet isimli kullanc login olarak a programn altrabilir mi? A program b dosyasnayazma yapabilir mi?

    1) Mehmet kullancs herhangi bir kii olarak a dosyasna eriip onu altrabilir.

  • 8/14/2019 Linux Sistem Programlama

    12/171

    C ve Sistem Programclar Dernei 12

    2) A program alp process olduunda a processinin etkin kullanc ID deeri Ali etkingrup ID deeri Project3tr. nk a alabilen dosyasnn yalnzca user ID deeri setedilmitir.3) Bundan sonra a processinin etkin kullanc IDsi b dosyasnn IDsi ile uyumadndan,etkin grup IDsi b dosyasnn IDsi ile uyumadndan ve b dosyasna herhangi bir kii

    yazma ilemi yapamayacandan, sonu olarak Mehmet kullanc a programn altrabilir,ama a program b dosyasna yazma yapamaz.

    Eer soruda a alabilen dosyasnn grup ID bayra set edilmi olsayd, a processinin etkingrup ID deeri Project1 olacandan yazma ilemi yaplabilecekti.

    Dosya ve Dizinlerin Sahiplik Bilgilerinin Oluumu

    Dosya yaratmak iin fopen standart C fonksiyonu ya da open sistem fonksiyonu kullanlabilir.Yaratlacak dosyann sahibi, grubu ya da sradan kii iin eriim haklar dosya yaratlrken

    open fonksiyonunun parametresinde belirlenir. Ancak yaratlm olan dosyann kullanc IDsive grup IDsi bu fonksiyonlarda belirlenmez. Bu belirleme otomatik olarak yaplr. Yaratlmher dosyann bir kullanc IDsi ve grup IDsi vardr. Yaratlan dosyann kullanc IDsi onuyaratan processin etkin kullanc IDsi olarak belirlenir. Ancak yeni yaratlan dosyann grupID deeri konusunda UNIX versiyonlar arasnda farklar vardr. rnein AT&T SVR4modellerinde yeni yaratlan dosyann grup IDsi dosya yaratan processin etkin grup IDsiolarak belirlenmektedir. Ancak BSD sistemlerinde yeni yaratlan dosyann grup IDsi iindeyaratlma ileminin yapld dizinin grup IDsi olarak belirlenmektedir. Ancak BSDsistemlerinde daha sonra bu durum dizinin grup ID bayrann set edilip edilmemesine gretespit edilir. POSIX.1 de bu durum istee bal bir biimde iletim sistemini yazanlarabraklmtr (Linux sistemlerinde default olarak dosyay yaratan processin grup ID deeri

    kullanlmtr).

    UNIX/Linux Sistemlerinde Dosya Sistemine likin lemler

    POSIX sistemlerinde dosya ilemleri fonksiyon grubu ile yaplabilir:

    1) Standart C fonksiyonlar ile yaplabilir. Standart C fonksiyonlarna tamponlanmfonksiyonlar (buffered I/O functions) da denilmektedir. Bilindii gibi standart C fonksiyonlardorudan iletim sisteminin aa seviyeli dosya fonksiyonlarn ararak ilemlerini yapar.Ancak bir tamponlama mekanizmas kullanrlar. rnein standart C fonksiyonlar ile birokuma yapldnda nce okunan bilgi tamponda m diye baklr, tamponda ise alnr,tamponda deilse tazeleme yaplr ve ondan sonra yine ayn tampondan alnr. Byleliklesistemin daha etkin alaca dnlmtr. Tabii standart C fonksiyonlar iletim sisteminezg ayrntl dosya ilemleri iin yetersizdir.2) Standart POSIX dosya fonksiyonlar ile POSIX.1 de tanmlanm olan open, close, read,write gibi aa seviyeli fonksiyonlar vardr. Bu fonksiyonlarn yetenekleri daha fazladr.POSIX fonksiyonlar baz sistemlerde dorudan sistem fonksiyonu konumunda olabilir ya dabu fonksiyonlar da gerek sistem fonksiyonlarn aran arabirim fonksiyonlar olabilir.3) Gerek sistem fonksiyonlarnn arlmas ile yaplabilir. letim sisteminin gerek sistemfonksiyonlar standart deildir ve pek ok sistemde tasarm teknii farkl olabilir.

  • 8/14/2019 Linux Sistem Programlama

    13/171

    C ve Sistem Programclar Dernei 13

    UNIX/Linux programlamada eer hzl, ayrnts olmayan, fakat ok tanabilir kodlaryazlmak istenirse o zaman dorudan standart C fonksiyonlarnn kullanlmas en iyiseenektir. Ancak POSIX sistemlerine zg ilemler yaplacaksa o zaman POSIXfonksiyonlar tercih edilmelidir. Dorudan sistem fonksiyonlarnn kullanlmas iin ok azgereke vardr. Standart C ktphanesi ayn zamanda POSIX standartlarnda da geerli bir

    ktphanedir.

    Temel dosya ilemlerinin dnda POSIX sistemlerinde dosya sistemine ilikin bir takmfaydal ilemler iin standart POSIX fonksiyonlar da vardr. rnein dizin dosya silme, dizindeitirme, dosyann ismini deitirme gibi ilemler iin standart POSIX fonksiyonlarkullanlr.

    Dosya Sistemi ile lgili lem Yapan Yardmc POSIX Fonksiyonlar

    Bu fonksiyonlarn bir ka istisnas dnda hepsinin geri dn deeri int trndendir ve

    baary anlatmaktadr. Fonksiyonlar baarl olduu zaman 0 deerine baarsz olduuzaman 1 deerine geri dnerler. Baarszlk durumunda ktphanede bulunan errno isimliglobal deiken set edilir. errno ierisindeki deer baarszln nedenini belirtmektedir. Bufonksiyonlarn ounun prototipleri unistd.h dosyas ierisindedir. Fonksiyonlarn kullandeitli tr isimleri sys/types.h dosyasnda bildirilmitir. Ancak her fonksiyonun gereksinimduyduu balk dosyalar ayrca belirtilecektir.

    errno Deikeni, strerror ve perror Fonksiyonlar

    Standart C fonksiyonlarnn bazlar ve POSIX fonksiyonlarnn ou baarszlk durumunda

    1 deerine geri dnerler. Ancak bu fonksiyonlar baarszln nedenini geri dnmeden ncektphanedeki errno isimli global bir deikene yazarlar. errno errno.h dosyas ierisindeextern olarak bildirilmitir. Bu deikenin global tanmlamas ktphane ierisindeyaplmtr. errno int trden bir deikendir. Hata olutuktan sonra errno ierisindeki her birdeer fakl bir hata durumunu anlatmaktadr. Bu saysal deerler ayn zamanda EXXXbiiminde sembolik sabitler olarak errno.h ierisinde define edilmitir. Bylece errnodeikeninin karlatrlmasnda sembolik sabitler kullanlr.

    if (errno == ENOEND) {//...//...

    }

    Bir hata olutuunda hata olaslklarnn ne olduu POSIX ierisinde dokmante edilmitir.rnein bir dosyann alamadn dnelim; dosyann alamamasnn belirli sayda nedenivardr. Ancak programclar oluan hata iin bir mesaj metni yazdrmak isterler ve bu dayardmc fonksiyonlar kullanlmadan zor yaplacak bir ilem deildir. strerror fonksiyonu hatanumarasn, yani errno deikeni ierisindeki sayy parametre olarak alr ve mesaj metninegeri dner. Prototipi string.h dosyas ierisindedir.

    char *strerror(int errno);

    Fonksiyon static yerel bir dizinin adresi ile geri dnmektedir. rnein fonksiyon ylekullanlabilir:

  • 8/14/2019 Linux Sistem Programlama

    14/171

    C ve Sistem Programclar Dernei 14

    if (open(...) == -1) {pMessage = strerror(errno);puts(pMessage);exit(1);

    }

    perror fonksiyonu dorudan errno global deikenine bakarak mesaj metnini stdout dosyasnayazdran kullanl bir fonksiyondur. Prototipi stdio.h dosyas ierisindedir.

    void perror(const char *pMsg);

    Fonksiyon nce parametresi ile belirtilen yazy yazar, sonra : karakterini yerletirir, sonra daerrno deikenine karlk gelen mesaj metni yazdrr, en sonunda \n ile aa satra geiyaplr. rnein;

    if (open(...) == -1) {

    perror(Error);exit(1);}

    unlink ve remove Fonksiyonlar

    Bu fonksiyonlar dosya silmek amac ile kullanlr ve ikisi tamamen edeerdir. removefonksiyonunun prototipi stdio.h ierisinde unlink fonksiyonunun unistd.h ierisindedir.

    int unlink(const char *path);int remove(const char *path);

    Bu fonksiyonlar dosyann balant saysn bir azaltr. Eer balant says 0a dmsedosyay fiziksel olarak silerler. Dosya balantlar ileride ele alnacaktr. Fonksiyonlar baarlise 0a, baarsz ise 1 deerine geri dnerler. Bu fonksiyonlar ile dizinler silinemez. removefonksiyonu Dos ve Windows sistemlerinde ayn biimde vardr. Ayn zamanda standart Cfonksiyonudur.

    rename Fonksiyonu

    Bu fonksiyon dosyann ismini deitirmek iin kullanlr. Ayn zamanda standart Cfonksiyonudur. Prototipi stdio.h ierisindedir.

    int rename(const char *oldname, const char *newname);

    Fonksiyon baarszlk durumunda 1 deerine baarl olma durumunda 0 deerine geridnerler.

    chdir Fonksiyonu

    Bu fonksiyon o andaki geerli dizini deitirmekte kullanlr. Geerli dizin (current workingdirectory) greli path verildiinde greli path ifadesinin nereden balatlacanbelirlemektedir. Fonksiyonun prototipi unistd.h ierisindedir.

  • 8/14/2019 Linux Sistem Programlama

    15/171

    C ve Sistem Programclar Dernei 15

    int chdir(const char *path);

    Fonksiyon baarszlk durumunda 1, baar durumunda 0 deerine geri dner.

    getcwd Fonksiyonu

    Bu fonksiyon o anda allan dizini path ifadesi olarak elde etmekte kullanlr. Prototipiunistd.h ierisindedir.

    char *getcwd(char *path, size_t size);

    Fonksiyonun birinci parametresi path bilgisinin doldurulaca dizinin adresi, ikinciparametresi dizinin uzunluudur (Yani fonksiyon en fazla size-1 karakter yerletirir).Fonksiyon baar durumunda birinci parametresinde belirtilen adrese, baarszlk durumundaNULL deerine geri dner.

    /* getcwd.c */

    #include #include #include

    int main(){

    char path[256];

    if (getcwd(path, 256) == NULL) {fprintf(stderr, "Cannot Get Path\n");

    exit(1);}

    printf("%s\n", path);

    return 0;}

    stat ve fstat Fonksiyonlar

    Bu fonksiyonlar ismi ya da handle deeri bilinen bir dosyann bilgilerini elde etmek iin

    kullanlrlar. Bu fonksiyonlarn prototipleri sys/stat.h dosyas ierisindedir. Ancak bufonksiyonlar kullanrken eitli typedef isimlerine de gereksinim duyulur. Bu tr isimlerisys/types.h ierisinde belirtilmitir. Bu nedenle bu fonksiyonlar kullanabilmek iin bu ikidosya include edilmelidir.

    int stat(const char *path, struct stat *buf);int fstat(int filedes, struct stat *buf);

    Bu iki fonksiyon da tamamen ayn ilemleri yapar. stat fonksiyonu dosyann path bilgisi ilefstat handle deeri ile alr. Yani fstat fonksiyonunu kullanabilmek iin nce dosyann aaseviyeli open fonksiyonu ile alm olmas gerekir. Fonksiyonlar baar durumunda 0

    deerine, baarszlk durumunda 1 deerine geri dnerler ve errno set edilir. stat isimli yap

  • 8/14/2019 Linux Sistem Programlama

    16/171

  • 8/14/2019 Linux Sistem Programlama

    17/171

    C ve Sistem Programclar Dernei 17

    perror("stat error");exit(1);

    }

    printf("%ld \n", status.st_size);printf("user ID: %d \n", status.st_uid);printf("group ID: %d \n", status.st_gid);

    return 0;}

    Dosya Trnn Belirlenmesi

    Genel olarak POSIX sistemlerinde bir dosya normal sradan bir dosya olabilir, bir dizindosyas olabilir, zel karakter dosyas olabilir, zel blok dosyas olabilir, socket ya da FIFOdosyalar olabilir. Dosyann eriim bilgileri ve tr stat yapsnn unsigned short trdenst_mode elemanna bit olarak kodlanmtr. Ancak bu bit kodlama ilemi sistemden sisteme

    deitii iin tanabilirlii salamak amac ile zel makrolar kullanlmaldr. st_modeeleman bu makroya sokulur, makrodan sfr deeri elde edilirse dosya ilgili trden deil, sfrd bir deer elde edilirse dosya ilgili trdendir. Kullanlan makrolar unlardr:

    S_ISREGS_ISDIRS_ISCHRS_ISBLKS_ISFIFO

    rnein bir dosyann dizin olup olmad aadaki ilemle anlalabilir.

    if (S_ISDIR(status.st_mode)) {//...//...

    }

    Dosyann eriim haklar iin de & ilemine sokulabilecek aadaki sembolik sabitlertanmlanmtr:

    S_IRUSRS_IWUSRS_IXUSRS_IRGRPS_IWGRPS_IXGRPS_IROTHS_IWOTHS_IXOTH

    st_mode deeri buradaki sembolik sabitlerle & ilemine sokularak ilgili zelliin olupolmad anlalr. rnein:

    if (status.st_mode & S_IWUSR) {//...

    }

    Burada dosyann sahibine yazma hakk verilip verilmedii test edilmek istenmitir.

  • 8/14/2019 Linux Sistem Programlama

    18/171

    C ve Sistem Programclar Dernei 18

    DOS ve Win32 Sistem Programclar iin Not: stat fonksiyonu DOStaki findfirst,Win32deki FindFirstFile fonksiyonlarna ilevsel olarak benzemektedir. Bilindii gibi bufonksiyonlar dosya bilgilerinin dizin girilerinden alp ffblk ya da WIN32_FIND_DATA

    trnden yaplar ierisine doldururlar.

    UNIX/Linux Sistemlerinin Disk Organizasyonunun Temelleri

    AT&T tabanl UNIX iletim sistemlerinin dosya sistemi s5fs (System 5 File System) ismiyleanlr. Berkeley (BSD) sistemleri klasik UNIX dosya sistemine baz yenilikler getirmitir.Berkeley tabanl bu dosya sistemine FFS/UFS (Fast File System / UNIX File System)denilmektedir. Linux sistemlerinde eitli eklentiler yaplmtr. u anda Linux sistemlerininyaygn olarak kulland dosya sistemi ext2 (Second Extention File System) denir.

    DOS ve Win32 Sistem Programclar iin Not: Klasik DOS'un dosya sistemi FAT ismiyle ileanlr. Win95 ile birlikte bu sistem uzun dosya isimlerini ierecek biimde geniletilmitir. Budosya sistemi VFAT biiminde isimlendirilmitir. OS/2 sistemleri HPFS isimli farkl birdosya sistemi kullanrlar. Nihayet Windows NT'lere zg ayrntl bir dosya sistemi dekullanlmaktadr. Bu sistemler NTFS ismi ile anlr.

    Dosya sistemlerinin incelenmesi iki aamada yaplmaldr.

    1) Kullanc gzyle incelenmesi: Bu inceleme dosya sisteminin kullanclar tarafndan naslkullanlacan anlamak ile ilgilidir. Yani dosya sisteminin d dnyadan nasl gzktnnanlalmasdr. letim sisteminin dsal grntsnn tamam resmi olarak sunduu dosya

    sistem fonksiyonlar kadardr.2) Dosya sisteminin disk organizasyonunun incelenmesi: Dosya sistemi aslnda aaseviyeli bir disk organizasyonuna dayanr. Bu inceleme klasik kullanc ya da programclariin nemli deildir. Ancak aa seviyeli programlama ile uraan sistem programclar iindisk organizasyonunun bilinmesi nemlidir. Disk organizasyonu bilinmeden baz kavramlarnanlalmas da zor olmaktadr.

    Bilindii gibi tipik bir FAT sisteminin disk organizasyonu aadaki gibidir.

    Boot Sector

    FAT(1)FAT(2)ROOTDIRDATA

    FAT dosya sisteminde boot sektr ierisindeki BPB alan diskin kritik bilgilerini tutmaktadr.Dosya ierikleri DATA blmnde cluster'larda saklanmaktadr. Bir cluster ardk n sektruzunluundadr n says BPB blounda yazmaktadr.

    Yukarda sz edilen UNIX/Linux dosya sistemlerinin disk organizasyonu birbirlerine okbenzerdir. Tipik UNIX/Linux dosya sistemlerinin dosya organizasyonu diski drt blme

    ayrdr.

  • 8/14/2019 Linux Sistem Programlama

    19/171

    C ve Sistem Programclar Dernei 19

    Boot SectorSuper Blocki-node BlockData Block

    Boot sektr iletim sisteminin yklenmesinde kullanlan sektrdr. Boot sektr hemen sperblok sektrleri izler Sper blok ierisinde disk organizasyonuna ilikin kritik bilgilertutulmaktadr. Sper blok grev bakmndan tamamen FAT dosya sistemindeki boot sektrBPB blou gibidir. UNIX/Linux dosya sistemlerinde de dosyann paralar ardk sektrlerdetutulur. Ancak FAT sistemindeki gibi "cluster" biiminde deil "block" biimindeisimlendirilmektedir. i-node bloklar i-node elemanlarndan oluur. Her i-node eleman birdosya bilgisini tutar.

    Yararl POSIX komutlar: df komutu dosya sistemindeki toplam blok saysn, ne kadarbloun kullanldn ve ne kadar bloun bo olduunu grmek amac ile kullanlr.

    Bir i-node eleman ierisinde hangi bilgiler vardr? Dosyaya ilikin dosyann ismi dndakibtn bilgiler i-node elemannda saklanr. rnein dosyann eriim bilgileri, zaman bilgileri,hangi kullancya ve gruba ilikin olduu, dosyann datalarnn hangi bloklarda olduubilgileri burada tutulmaktadr. stat ve fstat fonksiyonlar dosya bilgilerini i-nodeelemanlarndan almaktadrlar. i-node elemanlarnda dosyann ismi tutulmaz. Bir dosyann i-node numaras dosyann en nemli bilgilerindendir. Bilindii gibi stat fonksiyonu dosyann i-node numarasn da vermektedir. POSIX standartlarnda dosyann i-node numarasna ksacadosya numaras denilmektedir. Dosya seri numaras POSIX fonksiyonlarnda kullanlan birkavramdr. POSIX standartlar yalnzca UNIX/Linux trevi olan sistemler iindnlmemitir. Herhangi bir sistem bir POSIX ara yz salayabilir. Bu durumda busistemler farkl disk organizasyonlar kullanabilecekleri iin dosya numaras kavramn naslretirler? te bu sistemler srf POSIX uyumunu salamak iin dosyalar iin birer dosyanumaras uydurabilmektedir. i-node blounda ilki sfrdan balamak zere her i-nodeelemanna bir numara verilmitir. Dosya numaras ya da dosyann i-node numaras demekle odosyann bilgilerinin kanc i-node elemannda sakland anlalmaktadr.

    UNIX/Linux sistemlerinde de tpk FAT dosya sisteminde olduu gibi dizin ile dosyakavramlarnn organizasyonlar arasnda fark yoktur. Normal dosyalarn ierisinde bizimoluturduumuz bilgiler vardr. Dizin dosyalarn ierisinde de dizin ierisindeki dosyalarnbilgileri bulunur. Bir dizin dosyasnn ierii iki elemanl kaytlar biimindedir.

    i-node no Dosya ismi

    Bu durumda bir dizin dosyasnn ierisi tipik olarak yle olacaktr:

    i-node Dosya ismii-node no Dosya ismii-node no Dosya ismi

    Burada her bir kayt ka byte uzunluktadr? Bu durum sistemden sisteme deiebilmektedir. i-node numaras iin genellikle 4 byte yer ayrlr. Klasik UNIX sistemlerinde dosya ismi 14karakter uzunluundayd. Ancak bu gn pek ok sistemde dosya isimleri 256 karakter

    olabilmektedir. Bu sistemde bir dosyann ieriine eriilebilmesi iin nce o dosya dizingirilerinde aranmal ve i-node numaras elde edilmeli sonra i-node bloklarna gidilerek i-

  • 8/14/2019 Linux Sistem Programlama

    20/171

    C ve Sistem Programclar Dernei 20

    node bilgileri ele geirilmeli. Tabii bu sistemde root dizininin yeri bilinmek zorundadr.Gerekten de POSIX sistemlerinde root dizininin i-node numaras sfrdr. rnein statfonksiyonu ile C/D/E/F/g.dat dosyasnn bilgilerini alacak olalm. Burada stat fonksiyonu rootdizininden hareketle srasyla dizinlerin ierisinden geecek ve en sonunda dosyay bulacaktr.Tasarmda bu ilem kendi kendini aran fonksiyonlarla kolayca yaplabilir.

    UNIX/Linux sistemlerindeki en nemli zelliklerden birisi link kavramdr. Link bir dosyayafarkl bir dizinden farkl bir isimle erimek anlamna gelir. yle ki, farkl dizinlerdeki farklisimli iki dosyann i-node elemanlar ayn olursa bu iki dosya aslnda ayn dosyalardr. simleryalnzca bir semboldr. Bir dosyann yeni bir linkinden oluturmak iin link sistemfonksiyonu kullanlr.

    int link(const char *oldname, const char *newname);

    Fonksiyonun prototipi unistd.h ierisindedir. Baar durumunda 0, baarszlk durumunda -1deerine geri dner. Bir dosyann bir link'i oluturulduunda artk orijinali ile linki arasnda

    ayrt edici hi bir zellik kalmaz. Yani orijinal kopya ve link kavramlar yoktur, iki bilgitamamen e deer dzeyde tutulmaktadr. Bir dosyann ka link'e sahip olduu dosyayailikin i-node elemannda da tutulmaktadr. Bilindii gibi bu bilgi stat ya da fstat fonksiyonlarile alnabilir. Dosyann linklerinin says ls -l shell komutuyla da alnabilir. Bir dosyay silmekiin yalnzca unlink isimli bir fonksiyon vardr. unlink fonksiyonu silinmek istenen dosyanni-node elemanna bakar, onun link saysn bir eksiltir. Link says sfra dmedikten sonraunlink fonksiyonu yalnzca dizin giriini silmektedir. Ancak link says sfra dtndeunlink gerek silmeyi yapar. Dizinler iin link says dizin yaratldnda ikiden balar. nkaslnda link says ilgili i-node elamanna referans eden dizin girilerinin saysdr. Bir dizinyaratldnda hem yaratlan dizinin ierisinde referans oluacak hem de yaratlm olandizinde oluturulan '.' dosyas iin bir referans oluacaktr. Yeni yaratlan dizin ierisinde

    yaratlan her dizin iin dizinin link says bir artar. nk alt dizinlerin '..' isimli dosyalar dast dizinin i-node elemanna referans etmektedir.

    Bir dosyann toplam link says i-node elemannda yazar. Zaten bu nedenle stat fonksiyonu ileelde edilebilmektedir. Ancak bir dosyann btn linklerinin isimleri pratik bir biimdebulunamaz. Bunun iin btn dizin aacnn dolalmas gerekir.

    UNIX / Linux sistemlerinde Dizin Dolama lemleri

    UNIX/Linux sistemlerinde dizin dolama ilemleri iin opendir, readdir ve closedirfonksiyonlar kullanlmaktadr. Bu fonksiyonlar POSIX standartlarnda belirtilmitir,dolaysyla pek ok sistem tarafndan desteklenmektedir. Bu dosyalarn prototipleri dirent.hdosyas ierisindedir.

    DOS ve Win32 Sistem programclar iin not: DOS'ta bu ilemi yapan fonksiyonlar findfirstve findnext, Win32'de FindFirstFile ve FindNextFile'dr.

    POSIX sistemlerinde nce opendir fonksiyonu ile bir handle alnr, sonra readdir herarldnda yeni bir dizin girii elde edilir.

    DIR *opendir(const char *name);

    Fonksiyonun parametresi ierii elde edilecek dizin ismidir. rnein "/home/kaan" gibi

  • 8/14/2019 Linux Sistem Programlama

    21/171

    C ve Sistem Programclar Dernei 21

    olmaldr. Fonksiyon DIR yaps trnden bir handle alann dinamik olarak tahsis eder vehandle deeri ile geri dner. Baarszlk durumunda fonksiyon NULL deerine geri dner.

    struct dirent *readdir(DIR *dir);

    Bu fonksiyon her bulduu dosyann bilgilerini kendi ierisindeki static yerel bir struct direntyapsnn ierisine yerletirir ve bu yapnn balang adresiyle geri dner. Fonksiyonunparametresi opendir fonksiyonundan alnan handle deeridir. Geri dn deeri static biralann adresi olduu iin fonksiyon ok girili (reentered) deildir. Programc bu fonksiyonudng ierisinde arr. Fonksiyon artk dizinde bir dosya bulamad zaman NULL deeriile geri dner. Dizin dolama ilemi bittikten sonra handle alan closedir fonksiyonu ilekapatlmaldr.

    int closedir(DIR *dir);

    dirent yapsyledir:

    struct dirent {long d_ino;char d_name[NAME_MAX + 1];

    }

    Grld gibi dirent yaps aslnda dizin giriindeki bilgileri vermektedir. UNIX/Linuxsistemlerinin disk organizasyonu eitli deiiklikler gstermektedir. rnein bazsistemlerde her dizin eleman i-node numaras ve dosya ismi dnda baka bilgiler deierebilmektedir. Bu sistemlerde dirent yapsnn daha fazla eleman olabilir. Yukardaaklanan dirent yaps POSIX standartlarnda tanmlanm olan en kk durumdur.

    /*dizindolas1.c */

    #include #include #include

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

    DIR *dp;struct dirent *dinfo;

    if (argc == 1) {

    printf("Usage mydir \n");exit(1);

    }

    if (argc >= 3) {printf("too many argument!\n");exit(2);

    }

    dp = opendir(argv[1]);

    if (dp == NULL) {perror("opendir");

    exit(1);}

  • 8/14/2019 Linux Sistem Programlama

    22/171

    C ve Sistem Programclar Dernei 22

    while ((dinfo = readdir(dp)) != NULL)printf("%s\n", dinfo->d_name);

    closedir(dp);}

    /* dizindolas2.c */

    #include #include #include #include #include

    #define MAX_PATH_SIZE 1024

    void DirWalk(const char *path, void (*Proc) (const char *)){

    char fname[MAX_PATH_SIZE];struct dirent *de;struct stat status;DIR *dir;

    if ((dir = opendir(path)) == NULL) {perror("opendir");return;

    }while ((de = readdir(dir)) != NULL) {

    sprintf(fname, "%s/%s", path, de->d_name);Proc(fname);if (strcmp(de->d_name, ".") != 0 &&

    strcmp(de->d_name, "..") != 0) {if (stat(fname, &status) == -1) {

    perror("stat");break;

    }if (S_ISDIR(status.st_mode))

    DirWalk(fname, Proc);}

    }closedir(dir);

    }

    #if 1

    void Disp(const char *name){

    puts(name);}

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

    char fname[MAX_PATH_SIZE];char *plast;size_t size;

    if (argc != 2) {

    printf("Usage: dirtree \n");exit(1);

  • 8/14/2019 Linux Sistem Programlama

    23/171

    C ve Sistem Programclar Dernei 23

    }

    strcpy(fname, argv[1]);plast = strchr(fname, '\0') - 1;

    if (plast == '/')*plast = '\0';DirWalk(fname, Disp);

    return 0;}#endif

    /* dizindolas3.c */

    #include #include #include #include #include

    #define MAX_NAME_SIZE 1024

    void DirWalk(int indent, const char *name, void (*Proc)(int, const char *)){

    char cwd[MAX_NAME_SIZE];struct dirent *de;struct stat status;DIR *dir;

    if ((dir = opendir(name)) == NULL) {

    perror("opendir");return;

    }

    if (getcwd(cwd, MAX_NAME_SIZE) == NULL) {perror("getcwd");return;

    }

    if (chdir(name)) {perror("chdir");return;

    }

    while ((de = readdir(dir)) != NULL) {Proc(indent, de->d_name);if (strcmp(de->d_name, ".") != 0 &&

    strcmp(de->d_name, "..") != 0) {if (stat(de->d_name, &status) == -1) {

    perror("stat");break;

    }if (S_ISDIR(status.st_mode))

    DirWalk(indent + 1, de->d_name, Proc);}

    }

    closedir(dir);if (chdir(cwd)) {

  • 8/14/2019 Linux Sistem Programlama

    24/171

    C ve Sistem Programclar Dernei 24

    perror("chdir");return;

    }}

    #if 1

    void Disp(int indent, const char *name){

    int i;

    for (i = 0; i < indent * 2; ++i)putchar(' ');puts(name);

    }

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

    char fname[MAX_NAME_SIZE];char *pLast;

    if (argc != 2) {fprintf(stderr, "Usage: dirtree \n");exit(1);

    }strcpy(fname, argv[1]);pLast = strchr(fname, '\0');if (*pLast == '/' && strlen(fname) != 1)

    *pLast = '\0';DirWalk(0, fname, Disp);return 0;

    }

    #endif

    /* dizindolas4.cpp */

    #include #include #include #include #include #include #include

    using namespace std;

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

    DIR *dp;struct dirent *dinfo;vector dirlist;

    if (argc == 1) {cerr 3) {

    cerr

  • 8/14/2019 Linux Sistem Programlama

    25/171

    C ve Sistem Programclar Dernei 25

    }dp = opendir(argv[1]);if (dp == NULL) {

    perror("opendir");exit(1);

    }while ((dinfo = readdir(dp)) != NULL)

    dirlist.push_back(dinfo->d_name);sort(dirlist.begin(), dirlist.end());copy(dirlist.begin(), dirlist.end(),ostream_iterator(cout, "\n"));closedir(dp);

    }

    Blok Kavram

    UNIX/Linux sistemlerinde bir dosyann paras olabilecek en kk tahsisat birimine blok

    denilmektedir. Blok kavram FAT ve VFAT dosya sistemlerindeki cluster kavramyla aynanlamdadr.

    DOS veWin32 Sistem Programclarin Not: FAT ve VFAT sistemlerinde bir cluster'n kasektrden olutuu boot sektr ierisindeki BPB alannda belirtilmektedir.

    Bir bloun ka sektr olduu baz UNIX sistemlerinde sistemin kurulumu ya da dosyasisteminin oluturulmas srasnda belirlenebilmektedir. Baz sistemlerde belirleme yaplmaz.UNIX sistemlerinde 1 blok = 2 sektr = 1024 byte'tr. UNIX/Linux sistemlerinde de btndisk sfrdan balayarak bloklara ayrlmtr. Her bloun bir numaras vardr.

    UNIX/Linux sistemlerinde blok analizi iin tipik olarak df ve du komutlar kullanlmaktadr.df komutu dosya sistemindeki toplam blok saysn, tahsis edilmi ve kullanlabilir bloksaylarn vermektedir. du komutu ise recursive olarak belirlenen dizinden itibaren dibe inerektm dizinlerin kaar blok uzunlukta olduunu bilgisini vermektedir. du komutu dizin dolamafonksiyonlar ile yazlmtr. Dolaysyla eriim hakk yetersizliinden dolay bir dizinegeilemez ise error mesajn stderr dosyasna yazar.

    C ve C++ programclar iin not: C'de stdin klavyeyi, stdout ekran ve stderr de errordosyalarn temsil eder. C++'ta cout nesnesi stdout dosyas ile, cin nesnesi stdin dosyas ile vecerr nesnesi stderr dosyas ile ilikilidir. Default olarak sistemlerde stderr dosyas stdoutdosyasna ynlendirilmi durumdadr. DOS'ta komut satrnda > ynlendirme ilemi yalnzca

    stdout dosyasn ynlendirir. rnein DOS'ta den.exe > x biiminde bir programaltrdmzda programn stdout dosyasna yazdklar x dosyasna aktarlr, ancak stderrdosyasna yazdklar ekrana kmaya devam eder. Ayn durum UNIX/Linux sistemleri iin degeerlidir.

    UNIX/Linux sistemlerinde shell zerinden stderr dosyas 2> sembol ile herhangi bir dosyayaynlendirilebilir. Baz UNIX/Linux komutlar eitli error mesajlar oluturmaktadr. Bu errormesajlarndan kurtulmak iin stderr dosyas ynlendirilebilir. Bu tr ynlendirmeler iin zel

    /dev/null dosyas tasarlanmtr. Bu dosya gerek bir dosya deildir gelen bilgileri siler.

    du 2> /dev/null

  • 8/14/2019 Linux Sistem Programlama

    26/171

    C ve Sistem Programclar Dernei 26

    mount lemi

    DOS ve Windows sistemlerinde dosya sistemleri src kavram altnda kullancyasunulmaktadr. Bu sistemler heterojen dosya sistemlerini farkl srcler olarakgsterebilmektedir. Ancak UNIX/Linux sistemlerinde src kavram yoktur. mount ilemi

    ile bir dosya sisteminin kk dizini nceden yaratlm olan bir dizin ile aktrlarak onoktaya monte edilebilmektedir. mount edebilmek iin kesinlikle bir dizinin yaratlm olmasgerekir. mount edilen nokta ve bu noktann aasndaki tm aa mount ileminden sonraeriilebilirlik zelliini kaybeder. Bu nedenle genellikle mount ilemleri iin ayr dizinleryaratmak gerekir. mount ilemi mount sistem fonksiyonu ile yaplabilir ya da dorudanaltrlabilen bir mount program da salanmtr. mount ilemi sistemin btnlbakmndan nemli bir ilemdir bu nedenle bu ilemi ancak root kullancs yapabilir. mountkomutunun basit biimi yledir:

    mount

    mount ilemi UNIX/Linux sistemlerinde her aygt ve dosya sistemi /dev dizinindeki sembolikbir dosya ile temsil edilir. rnein floppy disket dev/fd0 ile, birinci sabit diskin disk blmeleri/dev/hda1, /dev/hda2 ile temsil edilmektedir. rnein floppy aadaki gibi mount edilebilir.

    mount /dev/fd0 /usr/floppy

    mount komutu dm noktas ile belirtilen srcdeki dosya sistemini otomatik olarak tespitetmeye alr. mount komutuna -t switch'i eklenebilir. Bu switch'i dosya sistemine ilikin trbilgisi izlemelidir. rnein:

    mount -t vfat /dev/fd0 /usr/floppy

    Sistem aldnda grdmz kk dosya sistemi de aslnda mount ilemi ile elde edilmitir.mount ilemi umount ilemi ile kaldrlabilir (mount edilen aygt zerinde ilemler devamediyorsa umount ilemi yaplamaz). rnein:

    umount /usr/floppy

    UNIX/Linux Sanal Dosya Sistemi (VFS)

    UNIX/Linux sistemlerinde donanm aygtlar (sabit disk, disket src, fare, seri port, paralel

    port ...) birer dosya olarak ilem grr. Btn bu aygtlar temel sistem fonksiyonlar olanopen, close, read ve write fonksiyonlar ile ynetilebilirler. UNIX/Linux sistemlerindezerinde allan aygt ne olursa olsun aygta temel sistem fonksiyonlar ile hep ayn biimdeeriilir. Sistemin aygt bamsz dosya ilemlerini gerekletiren blmne sanal dosyasistemi (Virtual File Sytem) denilmektedir. UNIX/Linux sistemleri 80'li yllardan itibarennesne ynelimli programlama tekniinden etkilenmitir. Sanal dosya sistemi ok biimli(polimorfik) bir tasarm yapsna sahiptir. Yani programc open ya da read fonksiyonunukullanrken bu ilemler gerekte ilgili aygt srcsnn open ya da read fonksiyonlarnarr.

    Bilindii gibi bir process yaratldnda iletim sistemi process'e ilikin kritik bilgileri bir

    process tablosunda saklamaktadr (Win32 sistemlerinde process tablosuna process veritaban(process database) denilmektedir). Programc process zerinde ilemler yapmak isterse

  • 8/14/2019 Linux Sistem Programlama

    27/171

    C ve Sistem Programclar Dernei 27

    process tablosuna erimekte kullanlan bir handle deerinden faydalanr. Process'in handledeeri iletim sistemlerinde process'i altran kii tarafndan doal olarak elde edilir.almakta olan baka process'lerin handle deerleri iletim sisteminin salad eitlifonksiyonlarla elde edilebilmektedir.

    Process'e ilikin process tablosunda pek ok bilgi tutulmaktadr. Bu konudan process ynetimiksmnda bahsedilecektir. Ancak konu ile ilgili olarak baz aklamalar burada yaplacaktr.Process'in kullanmakta olduu dosyalar bir biimde iletim sistemlerinde process tablosundatutulmaktadr.

    Popler iletim sistemlerinde dosyalara erimek iin bir handle deeri kullanlr. Win32sistemlerinde bu deere "File Handle" UNIX/Linux sistemlerinde dosya betimleyicisi (FileDescriptor) denilmektedir. Bir dosya aldnda iletim sistemi dosya ilemleriniynetebilmek iin bir alan tahsis eder. Dosyaya eriim iin gerekli bilgileri o alana yerletirir.Bu alana genellikle dosya nesnesi (file object) denilmektedir. Programc dosyay atndahandle deeri olarak dosya nesnesinin adresini elde etmez. letim sistemi dosya nesnesinin

    adresini dosya tablosu denen bir tabloya yazar.

    Handle deeri olarak bu tablodaki satr numarasn verir. Dosya tablolar process'e zgdr vegirii process tablosu ierisindedir. Bu tasarm biimi popler pek ok iletim sisteminde aynbiimde kullanlmaktadr. rnein UNIX/Linux sistemleri ile Win32 sistemleri bu bakmdanbenzer tasarma sahiptir. rnein UNIX/Linux sistemlerinde open sistem fonksiyonunuararak bir dosya am olalm ve bize handle deeri olarak (dosya betimleyicisi olarak) 18deeri verilmi olsun. yle bir ekil oluur.

    DosyaTablosu

    GstericisiDosya Tablosu

    Dosya Nesnesi

    Process Tablosu(Process Database)Process ID

    DosyaBetimleyicisi

    18

    write

    Dosya lemlerinelikin Adres Dizisi

    Dosya

    ilemlerigstericisi

    read

  • 8/14/2019 Linux Sistem Programlama

    28/171

    C ve Sistem Programclar Dernei 28

    Grld gibi, bir dosyay atmzda elde edilen dosya betimleyicisi process'e zg grelibir deerdir. Yani biz bu process'te read fonksiyonuna 18 deerini girerek okuma yaparsak,bu dosyadan okuma yaparz, ama baka bir process bu deerle baka dosyadan okumayapabilir.

    Dosya tablosunun uzunluu genellikle dinamik olarak ayarlanmaz, bu uzunluk batanbelirlenmitir. Tablonun uzunluu ayn anda ak olabilecek dosya saysn belirtmektedir.rnein Linux2.X kernel versiyonlarnda bu say 256 biimindedir.

    Modern UNIX/Linux sistemlerinde VFS dosya sistemi ierisinde tm aygtlar zerindeilemler read, write gibi klasik POSIX fonksiyonlar ile yaplr. Bu fonksiyonlar nesneynelimli bir yaklamla aygta ilikin zel read, write gibi fonksiyonlar arrlar. Bu durumtipik olarak dosya nesnesi ierisinde dosya ilemlerini yapacak olan fonksiyonlarn adreslerinitutan bir tablo yoluyla yaplr. Grld gibi sistem fonksiyonlarn bir dosyabetimleyicisiyle ardmzda gerekte hangi fonksiyonlarn altrlaca bubetimleyicilerin gsterdii dosya nesnelerine baldr. Aslnda bu ilemin C++taki ok

    biimli karlyledir:

    class FileObject {public:

    virtual int read(...) = 0;virtual int write(...) = 0;

    private://...//...

    };

    sysread(FileObject *pFile, ...){

    pFile->read(...);}

    UNIX/Linux sistemleri pek ok popler dosya sistemini desteklemektedir. Bu dosyasistemlerinin disk organizasyonlar birbirinden farkldr. Her ne kadar farkl olsa daUNIX/Linux sistemleri bunlar bellekte bir super block yaps ierisinde ifade ederler. superblock yaps her dosya sistemi bilgilerini tutabilecek ekilde organize edilmitir. Super blockyaplar kendi aralarnda bir bal liste biiminde tutulur. Aygta ilikin super block yapsmount ilemi srasnda oluturulmakta, umount ilemi ile de yok edilmektedir. lgili dosyasistemine eriimde veri yaps olarak giri noktas super block yapsdr.

    Neden dosya handle deeri olarak dosya tablosunda bir offset verilmektedir de dorudandosya nesnesinin adresi verilmemektedir? Bu tasarmda birincil ama ynlendirme(redirection) yaplabilmektedir. rnein dosya tablosu ile oynanlarak dosya betimleyicilerineilikin nesne adresleri deitirilebilir. Bylelikle programda hi bir deiiklik yapmadanprogramn alt dosyalar deitirilebilmektedir. kincil olarak dosya nesnesine dorudaneriilmemesi daha gvenli bir yntemdir. Bu dosya sisteminin tasarm Win32 sistemlerindede benzer biimdedir.

    POSIX Dosya Fonksiyonlar

    POSIX fonksiyonlar baz sistemlerde dorudan sistem fonksiyonu olabilir, baz sistemlerdeise sarma fonksiyon olabilir. rnein Linux sistemlerinde tipik olarak gerek sistem

  • 8/14/2019 Linux Sistem Programlama

    29/171

    C ve Sistem Programclar Dernei 29

    fonksiyonlar 80h kesmesi biiminde yazlmtr. 80h kesmesi tipik olarak kesme kaps(interrupt gate) ierir. Kesme kaps yoluyla kod ring3 nceliinden ring0 nceliine geer.Burada ilk alan kod ka numaral sistem fonksiyonunun arldn anlayarak birtablodya bakarak uygun fonksiyonu arr. Bylece sistem fonksiyonu ring0 modundaaltrlr. Kukusuz sistem fonksiyonundan IRET komutu ile geri dnldnde tekrar ring3

    dzeyine dnlr. Genel olarak intel tabanl alan iletim sistemlerinde ring0da alankodlar iin kernel mod, ring3te alan kodlara ise user mod denilmektedir.

    Anahtar Notlar: Intel ilemcileri korumal moda geirildiinde 4 ncelikderecelendirilmesiyle ilemler yrtlr. En ncelikli derece 0dr, en az ncelikli derece3tr. almakta olan bir kodun 0-3 arasnda bir ncelik derecesi vardr. Bellek blgesi debenzer biimde 0-3 arasnda ncelik derecelerine atanmtr. Dk ncelikli kodlar kod vedata bakmndan yksek ncelikli bellek blgelerine eriemezler. letim sisteminin kritikkodlar ve datalar 0 ncelikli blgelerde bulunur (ring0) bylece sradan programlar budatalar bozamazlar. Ancak sistem fonksiyonlarnn bellekte her blgeye eriebilmesi gerekir.Bellekte her blgeye eriebilmesi iin sistem fonksiyonlarnn ring0da altrlabilmesi

    gerekir. te intel ilemcilerinde kap denilen bir kavram yoluyla iletim sisteminin izinverdii gvenli kodlar ncelik derecesi ykseltilerek altrlabilmektedir. Bylelikle ring3tealan kodlar iletim sisteminin gvenli kodlarn ring0da altrabilmektedir.

    open Fonksiyonu

    open fonksiyonu tipik olarak fopen fonksiyonu tarafndan arlan POSIX fonksiyonudur.

    int open(const char *path, int oflag, ...);

    open fonksiyonu iki parametreli ya da parametreli olarak kullanlabilir. Fonksiyonun

    eskiden iki parametresi vard, daha sonra geniletildi. ki farkl isimli fonksiyon olmasn diyedeiken sayda parametre alan bir grntye sokuldu.

    open fonksiyonu iki ya da parametreli arlr. parametreli kullanlrsa ncparametre eriim bilgileridir. Fonksiyonun ikinci parametresi eitli sembolik sabitlerin bit orilemine sokulmas ile elde edilir. Bu sembolik sabitler unlardr:

    O_RDONLYO_WRONLYO_RDWRO_APPENDO_CREATO_EXCLO_NONBLOCKO_TRUNC

    O_RDONLY, O_WRONLY, O_RDWR belirlemelerinden en az biri kullanlmaldr. Bubelirlemeler isimlerinden de anlalaca gibi okuma yazma ilemlerinin yaplacan belirtir.O_CREAT dosyay yoksa yaratr, dosya varsa bu deerin bir etkisi olmaz. O_TRUNC dosyavarsa onu sfrlar ancak dosya yoksa bir etkisi yoktur. O_EXCL tek bana kullanlmazmutlaka O_CREAT ile kullanlr. Normalde dosya varsa O_CREAT hi bir anlam ifadeetmez. Ancak bununla birlikte O_EXCL de kullanlmsa bu durum fonksiyonun baarszolmasna yol aar. O_APPEND yazma ilemleri srasnda sona eklemeye yol aar. Yani her

    yazma ilemi srasnda yazma fonksiyonlar otomatik olarak dosya gstericisini EOFdurumuna ekerek oraya yazar. open fonksiyonu baarlysa dosya betimleyicisi deerine,

  • 8/14/2019 Linux Sistem Programlama

    30/171

    C ve Sistem Programclar Dernei 30

    baarszsa 1 deerine geri dner. open fonksiyonunun prototipi ve a modunuoluturmakta kullanlan sembolik sabitler fcntl.h balk dosyas ierisindedir.

    open fonksiyonunun nc parametresi ancak O_CREAT belirlemesi yapldysa anlamldr.Bu parametre eriim haklarn belirlemekte kullanlr, fonksiyon bu parametreyi O_CREAT

    belirlemesi yaplmsa kullanr (eer yanllkla O_CREAT belirlemesi yapld haldenc parametre girilmemise bir derleme zaman hatas olumaz, fonksiyon stacktenrasgele bir deer eker). Eriim haklar iin geleneksel olarak dokuz bitlik saykullanlmaktadr. Dokuz bitlik bu sayda her bit yksek anlamldan dk anlamlya dorusrasyla sahip, grup, dier eriim bilgilerini belirlemektedir. 0666 -> 110 110 110 srasylawr-wr-wr-. Ancak fonksiyonun nc parametresinin bu biimde dokuz bit olarak girilmesiPOSIX standartlarnca garanti altna alnmamtr. Bunun iin daha nce incelediimizsembolik sabitler kullanlr. Bu sembolik sabitler sys/stat.h balk dosyas ierisindedir.

    S_I + R + USRS_I + W + OTHS_I + X + GRP

    rnein S_IWUSR dosyann sahibine yazma hakk verir.

    fd = open(a.dat,O_RDWR | O_CREAT | O_TRUNC,S_IUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);

    fopen fonksiyonundaki a modlarnn open fonksiyonundaki baz karlklarunlardr:

    r O_RDONLYr+ O_RDWR

    w O_WRONLY | O_CREAT | O_TRUNCw+ O_RDWR | O_CREAT | OTRUNC

    Processin Maskeleme Deeri

    open ve create fonksiyonlarnda belirtilen eriim haklar processin maskeleme deeri denilenbir deer ile ileme sokularak gerek eriim haklar belirlenir. Her processin bir maskelemedeeri vardr. Bir process baka bir processi yarattnda bu deer yeni processe aktarlr(Yani rnein shell zerinden program altrdmzda altrlacak processin maskelemedeeri shellin maskeleme deeri olur). Process maskeleme deerini istedii zaman umask

    sistem fonksiyonu ile deitirebilir. Genellikle shell tarafndan belirlenmi default maskelemedeeri 022 biimindedir. Processin maskeleme deerindeki 1 olan bitler dosyann yaratlmassrasnda kesinlikle dikkate alnmayacak eriim zelliklerini belirtmektedir. rnein 022(8lik sistemde) maskeleme deeri u anlama gelir:

    0 2 2000 010 010

    Burada grld gibi grup ve dier kiiler iin yazma hakk tamamen maskelenmitir. Yanibiz bu maskeleme deeri ile dosyay 666 eriim haklaryla yaratmak istesek bile dosya wr-r--r--haklaryla yaratlacaktr. Bu ilemlerin daha alglanabilir karlyledir:

    & ~

  • 8/14/2019 Linux Sistem Programlama

    31/171

    C ve Sistem Programclar Dernei 31

    Sonuta elde edilen deerin 0 olan bitleri eriimin yasakland 1 olan bitleri eriimin kabuledildii yerleridir. rnein:

    022 = 000 010 010~022 = 111 101 101& 110 100 100

    wr- r-- r--

    umask Fonksiyonu

    Processin default maskeleme deerini deitirmekte kullanlr.

    mode_t umask(mode_t mask);

    Fonksiyon processin maskeleme deerini parametresiyle belirtilen deer olarak belirler veeski maskeleme deerini geri dn deeri olarak verir. Processin maskeleme deerini alanbaka bir fonksiyon yoktur. Bu ilem yle yaplabilir:

    mode_t val;val = umask(0);umask(val);

    close Fonksiyonu

    Alan her dosya kapatlmaldr. Kapatlma ilemi bilinli olarak yaplmaz ise sistemtarafndan process bittiinde ak olan dosyalar kapatlr.

    int close(int fd);

    Fonksiyonun prototipi unistd.h balk dosyas ierisindedir.

    #include #include #include #include #include

    int main(){

    int fd;

    umask(0);

    fd = open("a.dat", O_RDWR | O_CREAT, 0666);if (fd == -1) {

    fprintf(stderr, "Cannot open file..\n");exit(1);

    }close(fd);

    }

    read ve write Fonksiyonlar

  • 8/14/2019 Linux Sistem Programlama

    32/171

    C ve Sistem Programclar Dernei 32

    POSIX dosya fonksiyonlar ok azdr. Btn yazma ve okuma ilemleri read ve write sistemfonksiyonlar ile yaplr.

    int read(int fd, void *buf, unsigned int nbyte);int write(int fd, const void *buf, unsigned int nbyte);

    Fonksiyonlarn birinci parametresi dosya betimleyicisi, ikinci parametresi transfer adresi venc parametresi transfer edilecek byte saysdr. Fonksiyonlarn geri dn deerleritransfer edilen byte saysdr. rnek bir kopyalama program. Fonksiyonlarn prototipleriunistd.h balk dosyas ierisindedir.

    UNIX/Linux ve DOS sistemlerinde aa seviyeli sektr temelinde kopyalama yapan sistemfonksiyonlar yoktur. Kopyalama ilemi iki dosyann alp bilgilerin blok blok tanmas ileyaplr. Blok bykl iin sektr katlar tercih edilmelidir.

    #include #include

    #include #include #include

    #define BLOCK_SIZE 1024

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

    int fds, fdd;char buf[BLOCK_SIZE];int n;

    if (argc != 3) {

    fprintf(stderr, "Wrong number of arguments...!\n");exit(1);

    }

    if ((fds = open(argv[1], O_RDONLY)) == -1) {fprintf(stderr, "Cannot open source file : %s\n", argv[1]);exit(1);

    }

    if ((fdd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1) {fprintf(stderr,"Cannot open destination file...!\n", argv[2]);close(fds);exit(1);

    }while (( n = read(fds, buf, BLOCK_SIZE)) > 0)

    write(fdd, buf, n);

    printf("1 File Copied...\n");close(fds);close(fdd);

    return 0;}

    read ve write fonksiyonlar baarszlk durumunda 1 deerine geri dnerler. Bu durumda

    baarszln nedeni klasik olarak errno deikeninden alnabilir. Ancak yukardakiprogramda baarszlk kontrol yaplmamtr. Yani okuma hatas olduunda program

  • 8/14/2019 Linux Sistem Programlama

    33/171

    C ve Sistem Programclar Dernei 33

    dngden kmaktadr. Bir dosya baarl bir biimde aldysa normal olarak read ve writefonksiyonlarnda hata olumamas gerekir. Hata ancak kritik bir biimde ortaya kabilir.Zaten bu tr durumlarda sistemin kendiside ou kez dzgn almayacaktr. read ve writefonksiyonlarnn son parametreleri ve geri dn deerleri baz UNIX/Linux sistemlerindeunsigned biimindedir. Ancak o sistemlerde de 1 deeri zeldir.

    creat Fonksiyonu

    Eskiden open fonksiyonunun yaratma zellii yoktu, bu nedenle dosyay ilk kez yaratmakiin creat fonksiyonu kullanlrd.

    int creat(const char *path, mode_t mode);

    Bu fonksiyon eski programlarn hatrna hala varln srdrmektedir. Eskiden openfonksiyonu yalnzca var olan dosyalar aabiliyordu, yeni bir dosya yaratmak iin bufonksiyonu kullanmak gerekirdi. Aadaki iki arma tamamen birbirine edeerdir.

    creat(path, mode);open(path, O_WRONLY | O_CREATE | O_TRUNC, mode);

    POSIX sistemlerinde creat fonksiyonunun kullanlmasnn bir gerei kalmamtr.

    open ve creat Fonksiyonlarnn Bo Dosya Betimleyicilerinin Tespit Edilmesi

    open ve creat fonksiyonlar ile yeni bir dosya yaratldnda dosya betimleyicisi olarak dosyatablosundaki kkten bye doru ilk bo slot elde edilir. rnein processin dosya

    tablosunun durumu yle olsun:

    imdi open ya da creat fonksiyonu ile dosya yaratldnda dosya betimleyicisi olarakkesinlikle 4 elde edilecektir.

    stdin, stdout ve stderr Dosyalarnn Yaratlmas

    Dolu

    Dolu

    Dolu

    Dolu

    Bo

    Dolu

    0

    1

    2

    3

    4

    5

    DosyaTablosu

  • 8/14/2019 Linux Sistem Programlama

    34/171

    C ve Sistem Programclar Dernei 34

    Shell programnn dosya tablosunda default olarak 3 dosya alm bir biimde bulunur.Bunlar 0 betimleyicisine ilikin stdin (klavye), 1 betimleyicisine ilikin stdout (ekran) ve 2betimleyicisine ilikin stderrdir. Btn programlar shell zerinden altrldna gre vedosya tablosu da altrlan processe aktarldna gre, yeni bir process oluturulduunda o

    processin de dosya tablosunun ilk slotunda bu dosyalar alm bir biimde bulunacaktr.Yeni yaratlm bir processin dosya tablosu yledir:

    rnein:

    write(1, Kaan, 4);

    write fonksiyonu yukardaki rnekte nesne ynelimli ve ok biimli bir biimde processtablosundan ve dosya tablosundan hareket ederek ekrana ilikin gerek write fonksiyonunuarr ve bu da yaznn ekrana kmasn salar. Kiinin hangi dosyaya yazaca ve gerektehangi fonksiyonun bu yazma ileminde kullanlaca dosya nesnesinde belirlenmektedir. kidosya betimleyicisinin deerleri farkl olsa ama bunlar ayn dosya nesnesini gsterse ayndosya zerinde ilem yapacaklardr. Dosya nesnesinde ayn zamanda dosya gstericisininaktif deeri de tutulmaktadr. Bu durumda farkl dosya betimleyicileri ayn dosya nesnesinigryorlarsa bunlarn dosya gstericisi de ortak olur. rnein fd1 ve fd2 farkl deerlereilikin dosya betimleyicileri olsun, fakat ayn dosya nesnesini grsn. Aadaki rnekte writeilemiyle pos pozisyonuna yazma yaplr.

    lseek(fd1, pos, SEEK_CON);write(fd2, ...);

    Dosya gstericisini konumlandrmakta kullanlan lseek fonksiyonu aslnda herhangi bir girik ilemine yol amamaktadr. Bu fonksiyon yalnzca dosya nesnesi ierisindeki aktif

    stdin

    stdout

    stderr

    Bo

    Bo

    Bo

    0

    1

    2

    3

    4

    5

    DosyaTablosu

    Klavye

    Ekran

    DosyaNesnesi

  • 8/14/2019 Linux Sistem Programlama

    35/171

    C ve Sistem Programclar Dernei 35

    pozisyon bilgisini deitirmektedir. stdout ve stderr dosyalarnn default olarak her ikisinin deekrana ilikin olmas bu biimde kolaylkla anlalabilir.

    #include #include #include

    #include #include

    int main(){

    int fd;

    close(1);if ((fd = open("a.dat", O_RDWR|O_CREAT|O_TRUNC, 0666)) == -1) {

    fprintf(stderr, "Cannot open file...!\n");exit(1);

    }printf("Merhaba\n");

    return 0;}

    Cnin Standart Dosya Fonksiyonlar ve Bu Fonksiyonlarn POSIX Fonksiyonlarylalikisi

    Cnin standart dosya fonksiyonlar hangi sistemde yazlmlarsa o sistemin gerek sistemfonksiyonlarn arrlar. rnein fread fonksiyonu UNIX/Linux sistemlerinde readfonksiyonunu, Win32 sistemlerinde ise ReadFile fonksiyonunu armaktadr. stdio.hierisinde prototipi olan printf, scanf gibi fonksiyonlar da aslnda birer dosya fonksiyonlardr.

    rnein printf default olarak stdout dosyasn kullanmaktadr. Cnin standart doysafonksiyonlarnn en nemli zellii tamponlu (buffered) bir alma sunmasdr.

    Aslnda modern sistemlerin hemen hepsinde dosya ilemlerine ilikin sistem fonksiyonlar dabir tampon mekanizmas ya da bir cache sistemi kullanmaktadr. Ancak terminolojidetamponlamal dosya fonksiyonlar denildiinde ekirdek tarafndan yaplan tamponlama deilkullanc alan ierisinde yaplan tamponlama anlalmaktadr. Sistem fonksiyonlarnnkulland tampon blgeler ekirdein bellek alan ierisindedir. Halbuki standart Cfonksiyonlarnn kulland tampon blgeler kullanc alan ierisindedir. Aslnda modernsistemlerde standart C fonksiyonlar iki kez tamponlamaya yol amaktadr. Bylece hzkazanmak bir yana, yavalamaya yol amaktadr. Fakat Cnin standart dosya fonksiyonlarbandan beri bir tampon mekanizmas ierisinde tasarlanmtr. Standartlarda anlatmlar vefonksiyonlar tamamen tamponlu bir alma zerine kurulmutur. zetle Cnin dosyafonksiyonlarnn tamponlu olmas standartlara yansm temel zelliklerdendir. Cnin dosyafonksiyonlar hemen iletim sisteminin sistem fonksiyonlarn armak zorunda deildir.Bilgileri bir tampon alanda tutup istedii bir zamanda sistem fonksiyonunu arr. Dosyanntazelenmesi (flush edilmesi) yani fflush fonksiyonunun arlmas tampondaki bilgininsistem fonksiyonlar arlarak dosyaya aktarlmas anlamna gelir. fclose ilemi ile ya dadosya kapatlmamsa processin sonlanmas ile tazeleme ilemi yaplmaktadr. Tazelemeileminin dosyann yalnzca okuma modunda aldnda hi bir anlam yoktur. nktazeleme tampondan dosyaya doru yaplan bir ilemdir. stdin dosyas da Cde yalnzca

    okunabilen bir dosya olarak kabul edilir. Bu nedenle fflush(stdin); ileminin de bir

  • 8/14/2019 Linux Sistem Programlama

    36/171

  • 8/14/2019 Linux Sistem Programlama

    37/171

    C ve Sistem Programclar Dernei 37

    komutu uygulandnda dosya iin tahsis edilen blok saysnn artmad grlecektir (dukomutunda bildirilen blok miktarnn cluster anlamndaki blok ile bir ilgisi yoktur, Linuxsistemlerinin ou default olarak cluster anlamndaki blou 8 sektr = 4096 olarak alrlar).Delik oluturabilmek iin dosya uzunluunun tesine konumlandrdktan sonra bazsistemlerde write ilemi yapmak gerekir. Delik oluturma POSIX standartlarnda belirtilmi

    standart bir davran deildir.

    /* lseek.c */

    #include #include #include #include #include

    int main(){

    int fd;

    if ((fd = open("a.dat", O_RDWR)) == -1) {perror("open error\n");exit(EXIT_FAILURE);

    }if (lseek(fd, 10000000, SEEK_SET) == -1) {

    perror("lseek error\n");exit(EXIT_FAILURE);

    }if (write(fd, "kaan", 4) == -1) {

    perror("write error");exit(1);

    }

    close(fd);return 0;

    }

    STDIN_FILENO, STDOUT_FILENO ve STDERR_FILENO Sembolik Sabitleri

    Bir process altrldnda dosya tablosunda default olarak dosya betimleyicisininbulunduunu belirtmitik. Bunlar stdin, stdout, stderr dosyalarna ilikin betimleyicilerdir.Bunlara ilikin betimleyiciler srasyla geleneksel olarak 0, 1, 2 deerlerindedir. Ancak budeerler POSIX standartlarna gre zorunlu deerler deildir. Bu standart dosyalara ilikin

    betimleyici deerleri unistd.h balk dosyas ierisinde STDIN_FILENO, STDOUT_FILENOve STDERR_FILENO biiminde belirtilmilerdir. Fakat 0, 1 ve 2 deerlerini dorudankullanan pek ok program kodu mevcuttur. Hemen hemen tm POSIX sistemlerinde busembolik sabitler geleneksel deerlerindedir.

    #include #include #include #include

    #define BUFLEN 1024

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

    char buf[BUFLEN];

  • 8/14/2019 Linux Sistem Programlama

    38/171

    C ve Sistem Programclar Dernei 38

    int fd;int n;

    if (argc != 2) {fprintf(stderr, "Wrong number of arguments...!\n");exit(EXIT_FAILURE);

    }

    if ((fd = open(argv[1], O_RDONLY)) == -1) {perror("open error");exit(1);

    }while (( n = read(fd, buf, BUFLEN)) > 0 )

    write(STDOUT_FILENO, buf, n);close(fd);

    }

    Sembolik Linkler

    Bilindii gibi ln komutu bir dosyann ayn i-node elemanna ilikin bir kopyasndanoluturmaktadr. rnein,

    ln a b

    gibi. ln komutu tipik olarak link sistem fonksiyonunu armaktadr. UNIX/Linuxterminolojisinde link denildii zaman ayn i-node elemann gren dosyalar anlalmaktadr.Bazen bu kavrama Hard Link de denilmektedir.

    Bir dizin iin hard link ilemi yaplabilir mi? Bu ilem ok tehlikeli olabilir, nk dizin

    aacn dolaan algoritmalar sonsuz dngye girebilirler; bu durum dosya sistemininbozulmasna bile yol aabilmektedir. rnein aadaki dizin yaps ierisinde A ile Tdizinleri bir hard link oluturmu olsunlar.

    A KX MY ZK T

    Burada A dizini dolalmaya allrsa A ile T dizinleri ayn i-node elemanna sahip olduuiin sonsuz dngsel bir durum oluacaktr. Bu nedenle pek ok sistemde bir dizinin hard link

    ilemine sokulmas ya tamamen yasaklanmtr ya da yalnzca root kullanclarna serbestbraklmtr. te bu nedenlerden dolay sembolik link kavram da gelitirilmitir. Semboliklink ln s komutu ile yaratlr. rnein,

    ln s a b

    gibi. Dizinler de her hangi bir kullanc tarafndan sembolik link ilemine sokulabilmektedir.Sembolik link durumu ls l komutunda ak olarak grlebilmektedir (eriim bilgilerinin ensolundaki karakter de 'l' olarak gzkmektedir). Sembolik link dosyalar aslnda ayr birdosyadr. Ancak baka bir dosyay referans etmektedir. Sembolik link dosyalar baz ilemleresokulduunda sembolik link dosyasnn kendisi deil, onun referans ettii dosya ilem

    grmektedir. rnein stat fonksiyonu ile bir sembolik link dosyasnn bilgileri alnacak olsasembolik link dosyalarn kendi bilgisi deil, onun referans ettii dosyalarn bilgileri

  • 8/14/2019 Linux Sistem Programlama

    39/171

    C ve Sistem Programclar Dernei 39

    alnmaktadr. Bir dizinin sembolik linki oluturulduunda artk bu dizin sistem iin bir dizingrnmnde olmaz, normal bir dosya grnmnde olur. Tabii dizin dolama ilemi de statfonksiyonu ile yaplmamaldr. Bunun iin lstat isminde baka bir fonksiyonbulundurulmaktadr. lstat fonksiyonunun stat fonksiyonundan normal dosyalar iin hi birfark yoktur. Ancak sembolik link dosyalarnda lstat fonksiyonu sembolik link dosyasnn

    referans ettii dosyann bilgilerini deil, sembolik link dosyasnn kendi dosya bilgilerini eldeeder. lstat fonksiyonu bir sembolik link ieren dizin dosyas ile karlatnda bunu bir dizindosyas olarak grmez. Btn bu anlatlanlarn zeti udur: Dizin aacn dolaanuygulamalarda stat deil, lstat fonksiyonu kullanlmaldr. Eer stat fonksiyonu kullanlrsasembolik link ilemine tutulmu dizinlerde yine sonsuz dng olumu olur. Baz nemlisistem fonksiyonlarnn sembolik link dosyalarna kar davranlaryledir:

    Fonksiyon smi Kendi Dosyas m?Referans Ettii Dosya m?

    lstat Kendi dosyas

    open referans ettii dosyaremove Kendi dosyasrename Kendi dosyasunlink Kendi dosyasaccess Referans ettii dosya

    Sembolik link oluturmak iin symlink fonksiyonu kullanlr.

    int symlink(const char *actualpath, const char *sympath);

    Fonksiyon baarlysa 0 deerine, baarszsa 1 deerine geri dner.

    Dosyann Tarih ve Zaman Bilgileri

    Bir dosyann ya da dizinin tarih/zaman bilgisi olarak stat ya da lstat fonksiyonu ile tr bilgiekilmektedir.

    st_atimest_mtimest_ctime

    st_atime dosyann data bilgilerine son eriim zamann belirtir. Yani dosya zerinde herhangibir read ya da write ilemi yapldnda bu deer deiir.st_mtime dosyann datalarnda yaplan son deiiklik zamann verir. Yani dosyaya writeilemi uygulandnda bu bilgi gncellenir.st_ctime dosyann datalar zerinde deil, i-node bilgileri zerinde deiiklik yapldndagncellenir. rnein dosyann datalar zerinde ilem yapmayp yalnzca i-node ile ilgiliilem yapan link fonksiyonu, utime fonksiyonu bu zaman bilgisini gnceller.i-node bilgilerine eriim ile ilgili zel bir bilgiye gerek duyulmamtr.

    Dosya Eriim Haklarnn Deitirilmesi

  • 8/14/2019 Linux Sistem Programlama

    40/171

    C ve Sistem Programclar Dernei 40

    chmod fonksiyonu bir dosyann eriim haklarn deitirmek iin kullanlr. Ancak dosyanneriim haklarnn deitirilebilmesi iin bu fonksiyonu aran processin etkin kullancIDsinin root ya da deitirilecek dosyann kullanc IDsi ile ayn olmas gerekir.

    int chmod(const char *path, mode_t mode);

    Fonksiyonun birinci parametresi deitirilecek dosyann ismi, ikinci parametresi ise yenieriim bilgileridir. Fonksiyon baarl ise 0 deerine, baarszsa 1 deerine geri dner.Dosyann eriim bilgilerini deitirmek iin chmod isimli shell komutu da kullanlabilir.

    chmod 666 a.dat

    password ve group Dosyalar zerinde lemler

    nceden de belirtildii gibi geleneksel olarak UNIX/Linux sistemlerinde yaratlan bir

    kullancya ilikin pek ok deerli bilgi bir password dosyasnda saklanr. Geleneksel olarakpassword dosyas /etc/passwd ismi ile bulunur ve geleneksel olarak bu dosya text tabanl birdosyadr. POSIX standartlarnda password dosyasnn genel yaps belirtilmemitir. Yalnzcaolmas gereken minimum bilgilerden bahsedilmitir. Ancak klasik olarak password dosyasher bir satrn 7 paradan olutuu kaytlar halindedir. Her satrdaki 7 para birbirlerinden :ile ayrlmtr. rnein a:b:c:d:e:f:g gibi. password dosyasnn 7 blm genellikleunlardr:

    1) Kullanc ismi: Kullanc giri ismi2) ifrelenmi password bilgisi: Yeni kullanc yaratlrken bu blm bo geilebilir.Baz sistemlerde burada x harfi varsa ifrelenmi password bilgisinin baka bir dosyada

    olduu anlamna gelir (geleneksel olarak /etc/shadow).3) Kullanc ID deeri: Sistemin kullanclar tespit etmek iin gerek kulland deerkullanc ID deeridir. Kullancnn ismi okunabilirlik amacyla dnlmtr. rnein statfonksiyonundan elde edilen deer dosyann kullanc ID deeridir. Kullancnn ID deeribilindiinde kullancnn ismini elde edebilmek iin passwd dosyasna bavurmak gerekir. Bubilgi baka bir biimde elde edilemez. Tipik olarak ls komutu dizin ierisindeki dosyalarnisimlerini readdir fonksiyonu ile alr, bu isimler ile stat fonksiyonunu arr, struct statyapsndan kullanc ID deerini elde eder, sonra passwd dosyasna bavurarak kullancismini elde eder ve listeleme ileminde bu ismi kullanr.4) Grup ID deeri: Her kullanc bir gruba ilikin olur, gruplar da sistem tarafndan IDdeerleri ile kullanlrlar. Bu ksmda kullancnn ilikin olduu grubun ID deeri

    bulunmaktadr. Grup ID deeri bilindiinde grubun ismi group dosyasndan elde edilir.5) Aklama bilgisi: Bu blm tamamen aklama bilgisi ierir.6) cwd: Bu blmde altrlacak olan shell processinin varsaylan dizini belirtilir. Birkullanc yaratldnda genellikle buradaki bilgi /home/kullanc ismi biimindedir. Yanigeleneksel olarak her kullancnn bir ismi vardr, bu isim de /home dizininin altnda bir dizinekarlk gelir. Aslnda teknik olarak buradaki bilgi shell processinin varsaylan dizin (currentworking directory) bilgisidir. Aslnda varsaylan dizin kavram kullancya zg bir kavramdeil, processe zg bir kavramdr. login program 7. blmde belirtilen shell programnaltrr ve shell processinin geerli dizinini burada belirtilen dizin yapar. Yani kullancshell programna dtnde o andaki geerli dizin bu blmde belirtilen dizin olacaktr.UNIX/Linux sistemlerinde processin geerli dizini fork ilemi srasnda yeni yaratlanprocesse dorudan geirilmektedir.

  • 8/14/2019 Linux Sistem Programlama

    41/171

    C ve Sistem Programclar Dernei 41

    7) shell: Burada login programnn altraca shell programnn path ismibelirtilmektedir (Sisteme login olunduunda bir shell programnn altrlmas zorunludeildir).

    login Program Ne Yapar?

    login program tipik olarak unlar yapar:

    1) Kullanc ismi ve password sorma ilemini yapar.2) /etc/passwd ve /etc/shadow dosyalarna bavurarak doruluunu aratrr.3) password doruysa passwd dosyasnda yedinci blmde bulunan shell processinialtrr.4) shell processinin kullanc ID deerini kullancnn ID deeri olarak, grup ID deerinikullancnn ilikin olduu grup ID deeri olarak, geerli dizin bilgisini passwd dosyasndabelirtilen 6. blm olarak oluturur.

    5) shell zerinden bir program altrldnda bu bilgiler altrlan programaaktarldndan altrlan processin kullanc ID deeri, grup ID deeri ve geerli dizini aynolacaktr.

    Processin Geerli Dizini

    Geerli dizin processe zg bir bilgidir ve process tablosunda tutulur. Bu bilgi default olarakfork ilemi srasnda, yani bir processin altrlmas ileminde processi altranprocessten default olarak aktarlmaktadr. Yani shellden bir program altrdmzda oprogramn geerli dizini default olarak shell processininki olacaktr, shellinki de passwddosyasndan alnarak belirlenmektedir. Aslnda bir dizinde olmak gibi bir kavram yoktur.

    shell programlar processin geerli dizinini sanki bir dizin ierisindeymi gibigstermektedir. shell zerinden cd ilemi uygulandnda aslnda shell program chdir sistemfonksiyonu ile processin geerli dizinini deitirir, sonra bunu bir prompt eliindekullancya gsterir.

    passwd Dosyas zerinde lemler

    password dosyalarnn genel format sistemden sisteme deiebilmektedir. Programcpassword dosyas ierisinden bilgi almak isteyebilir. rnein bir dosyann kullanc IDsibellidir (rnein lstat fonksiyonu ile alnmtr). Programc kullanc IDsi yerine dosyannkullanc ismini yazdrmak isteyebilir. Bu durumda password dosyasna bavurmakzorundadr. Pek ok UNIX/Linux sisteminde password dosyalar yukarda belirtilen textformatna sahiptir. Ancak POSIX standartlarnda bunun bir garantisi yoktur, bu nedenlepassword dosyas ile ilgili eitli ilemleri yapan tanabilir bir grup fonksiyonbulundurulmutur.

    getpwuid ve getpwnam Fonksiyonlar

    struct passwd *getpwuid(uid_t uid); //sys/types.hstruct passwd *getpwnam(const char *name);

  • 8/14/2019 Linux Sistem Programlama

    42/171

    C ve Sistem Programclar Dernei 42

    Bu fonksiyonlar kullanc ID veya kullanc ismine gre password dosyasnda arama yapar vekiinin password bilgilerini struct passwd isimli bir yap ierisine doldurur. Geri verilen adresstatic yerel bir nesnenin adresidir, yani fonksiyon her zaman ayn adresi geri vermektedir.

    struct passwd {char *pw_name;char *pw_passwd;uid_t pw_uid;gid_t pw_gid;char *pw_gecos;char *pw_dir;char *pw_shell;

    };

    Fonksiyonlarn prototipleri ve struct passwd yaps pwd.h balk dosyas ierisindebildirilmitir.

    #include

    #include #include #include

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

    struct passwd *passi;

    if (argc != 2) {fprintf(stderr, "wrong number f arguments!...\n");exit(1);

    }

    passi = getpwnam(argv[1]);

    if (passi == NULL) {fprintf(stderr, "Cannot get password info\n");exit(1);

    }

    printf("username: %s\n", passi->pw_name);printf("user id: %d\n", passi->pw_uid);printf("Group id: %d\n", passi->pw_gid);printf("Home directory: %s\n", passi->pw_dir);printf("Shell prog: %s\n", passi->pw_shell);

    return 0;}

    password Dosyasndaki Tm Kaytlarn Elde Edilmesi

    password dosyasnda tpk dizinlerde olduu gibi gezinilerek tm kaytlar elde edilebilir.Bunun iin aadaki 3 POSIX fonksiyonu kullanlr.

    void setpwent(void);struct passwd *getpwent(void);void endpwent(void);

  • 8/14/2019 Linux Sistem Programlama

    43/171

    C ve Sistem Programclar Dernei 43

    Programc bir kere setpwent fonksiyonu ile balang ilemini yapar, sonra dng ierisindegetpwent fonksiyonunu arr. En sonunda da endpwent fonksiyonu ile ilemi bitirir.rnein getpwnam fonksiyonu tipik olarak bu fonksiyonlar kullanlarak yazlmtr. Bufonksiyon aadaki gibi yazlabilir.

    struct passwd *getpwnam(const char *name){struct passwd *passi;

    setpwent();while((passi = getpwent()) != NULL) {

    if (!strcmp(name, passi->pw_name))break;

    }endpwent();

    return passi;}

    group Dosyas zerinde lemler

    Normal olarak her kullancnn gerek tek bir grubu vardr. Bir kullancnn hangi grubailikin olduu passwd dosyasnda grubun ID deeri ile bulunmaktadr. Zaten struct passwdyapsnda bu bilgi de bulunmaktadr. Gruplar hakkndaki bilgiler (rnein gruplarn isimleri,gruplar ierisinde hangi kullanclarn bulunduu, grubun password bilgisi gibi) tipik olara