THT DUYURU

Linux Linux İle İlgili Bilgi Paylaşım Platformu

Seçenekler

linux işletim sistemi geniş ve yararlı

mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:46
#1
linux işletim sistemi geniş ve yararlı
UNIX Grubu İşletim Sistemlerinin Tarihsel Gelişimi:
UNIX işletim sisteminin tarihi 1968-69 senelerine dayanır.
C programlama dili UNIX işletim
sisteminin geliştirilmesi süresinde tasarlanmıştır. 1968 yılında AT&T’den K.Thombson,
D.Ritchie ve B.Kernighan Multics isimli bir işletim sistemi projesine başladılar. Multics
projesi MIT gibi üniversitelerle ortak olarak yürütülüyordu. Ancak Multics projesinin çeşitli
problemlerinden dolayı 1969 yılında AT&T projeden ayrılma kararı vermiştir. 1969 yılında
ekip yeni bir işletim sistemi yazma projesine başlamıştır. 1970 yılında B.Kernighan bu yeni
işletim sistemini Multics’ten kelime oyunu yaparak UNIX ismini vermiştir.
UNIX işletim sistemi 1970 yılında DEC’in PDP-7 makinelerinde yazılmıştır. UNIX’in bu ilk
versiyonu tamamen sembolik makine dilinde yazılmıştır. Yalnızca işletim sisteminin çekirdek
kısmı değil, tüm yardımcı programlar da sembolik makine dilinde yazılmışlardır.
K.Thombson bu yeni işletim sistemi için önceleri Fortran derleyicisi yazmaya niyetlendiyse
de daha sonra tamamen yeni bir arayışa geçmiştir. K.Thombson BCPL dilinden esinlenerek
alçak seviyeli işlemlerde kullanılabilecek B programlama dilini tasarlamış ve derleyicisini
yazmıştır. B her yönü ile tanımlanmış bir programlama dili değildir. Ancak çalışma ekibini
sembolik makine dilinden kurtarmıştır. D.Ritchie bu süreç içerisinde B programlama dilini
geliştirerek bugün kullandığımız C programlama dilini tasarlamış ve derleyicisini yazmıştır
(1971).
1973 yılında ekip DEC’in PDP-11 makineleri için UNIX işletim sistemini tamamen C
programlama dilini kullanarak yeniden yazmıştır. Bu özelliği ile UNIX sembolik makine
dilinde yazılmayan ilk işletim sistemi olmuştur. Bu durum işletim sisteminin kaynak
kodlarının taşınabilmesini sağlamış ve UNIX işletim sisteminin DEC makinelerinin dışında
da çalışabilmesine ön ayak olmuştur.
UNIX işletim sisteminin kaynak kodları pek çok araştırma gurubuna önceleri ücret talep
edilmeden verilmiştir. Bunun sonucu olarak bu ürünün geliştirilip pek çok farklı UNIX
işletim sistemlerinin oluşmasına neden olmuştur. Bunların en ünlüsü Berkeley tarafından
geliştirilmiş olan BSD versiyonlarıdır (Berkeley Software Distribution). BSD
versiyonlarından üçü serbest olarak dağıtılmıştır (Free BSD, Net BSD, Open BSD). Zamanla
AT&T’nin orijinal UNIX sistemleri ile Berkeley’in sistemlerinde rekabet oluşmuşsa da
AT&T’nin sistemleri üstünlük kazanmıştır. AT&T, UNIX sistemlerine bir versiyon numarası
vermiştir. Ayrıca bu sistemler önce System3 daha sonra da System5 biçiminde
isimlendirilmiştir. UNIX grubu sistemlerin temel referansı System5’tir.
AT&T 80’li yıllarda UNIX sistemlerine telif uygulama kararı almıştır. Bu durum
üniversitelileri tedirgin etmiştir, çünkü üniversitelerde bilgisayar araştırmalarında hep
UNIX’in kaynak kodları kullanılıyordu. Bunun üzerine Hollandalı bir profesör olan Andrew
Tanenbaum kendi derslerinde kullanabileceği küçük bir UNIX sistemi yazmıştır. Bu işletim
sistemi Minix diye isimlendirilmiştir.
1984 yılında Richard Stallman serbest yazılım fikrini ortaya atarak FSF (Free Software
Foundation) diye bilinen birliği kurmuştur. Amacı tamamen serbest ve bedava olacak bir çeşit
UNIX sistemi yazmaktı (www.fsf.org www.gnu.org). GNU projesi kapsamında pek çok
yardımcı yazılım geliştirilmiştir. Örneğin bu gün Linux sistemlerinde kullanılan gcc
derleyicisi ve imacs editörü bu proje kapsamında geliştirilmiştir. Ancak Richard Stallman ve
FSF kurumu yardımcı araçları geliştirdiyse de işletim sisteminin kendisini tamamen geliştirip
bitirememiştir. Serbest yazılım (Free Software) bedava yazılımdan ziyade başkasının
oluşturduğu bir yazılımı hiç izin almadan geliştirmek anlamındadır. Bu kavramda kişi
programını satabilir, ama kaynak kodu üzerinde bir hakka sahip olamaz, yani onu
sahiplenemez. Bunun için GNU Public License geliştirilmiştir.
1991 senesine gelindiğinde GNU projesine ilişkin pek çok şey yazılmıştır. Ama işletim
sisteminin çekirdeği yazılmamıştır. İşte Linus Torwalds, ismine Linux dediği bir çekirdek
yazarak GNU projesini tamamlamıştır. Bugün Linux’un pek çok sürümü vardır, fakat bu
sürümlerin hepsi aynı çekirdeği kullanmaktadır. GNU/Linux sistemleri Intel makinelerinin
dışında başka donanımlara da aktarılmıştır.
1980 yılların sonlarına doğru UNIX sistemleri kendi aralarında taşınabilir yapılmaya
çalışılmıştır. Böylelikle bir UNIX sistemi için yazılmış kaynak kodun başka bir UNIX
sisteminde de problemsiz derlenerek çalıştırılabileceği düşünülmüştür. Böyle bir
standardizasyon Richard Stallman tarafından önerilmiştir. Standartlaşma ile IEEE ilgilenmiş
ve 1003 numaralı standardizasyon ekipleri kurulmuştur. Bu standartlar POSIX (Portable
Operating System Interface for UNIX) biçiminde isimlendirilmiştir. Örneğin 1003.1 ya da
POSIX.1 UNIX sistemlerindeki sistem fonksiyonlarının neler olması gerektiğini belirler.
Diğer alt gruplar başka işlevsel özellikler konusunda belirlemeler oluşturmuştur. Bu gün
kullanılan UNIX ve Linux sistemlerinin hemen hepsi burada belirtilen POSIX standartlarına
uygundur. POSIX aslında IEEE tarafından yalnızca UNIX sistemlerine özgü bir standart
olarak ele alınmamıştır. UNIX gurubu dışındaki işletim sistemleri de isterlerse POSIX
standartlarına uyum sağlayabilirler. Örneğin NT gurubu sistemlerin POSIX alt yapısı vardır
ve POSIX’i desteklemektedirler.
UNIX Sistemine Giriş ve Temel Kavramlar
Temel olarak UNIX/Linux sistemleri monolitik bir yapıya sahiptir. Monolitik sistemlerde
işletim sisteminin çekirdek kısmı büyüktür ve neredeyse tek parça halindedir. Bu tür
sistemlerde sisteme ekleme yapmak zordur ve tüm çekirdeğin yeniden derlenmesini
gerektirmektedir. Monolitik yapının tersi mikro kernel teknolojisidir. Mikro kernel
sistemlerde işletim sisteminin çekirdeği küçük tutulur. İşletim sisteminin pek çok fonksiyonu
gerektiğinde sonradan yüklenilebilen modüller halinde tasarlanır. Bu tür sistemlerde işletim
sisteminin genişletilmesi başkaları tarafından daha kolay yapılır, ancak tasarımları ayrıntılı ve
zordur. Win32 sistemleri tipik olarak mikro kernel sistemi ile tasarlanmıştır.
UNIX sistemleri yüklendiğinde çekirdek tarafından oluşturulmuş bir process login programını
çalıştırır. Böylece sisteme girecek kişi bir login ekranıyla karşılaşır. Login ekranı ile
karşılaşıldığında işletim sistemi yüklenmiştir ve o anda login programı çalışmaktadır. login
programı kullanıcıdan bir kullanıcı ismi ve password ister ve bunun doğruluğunu kontrol eder
ve daha önce belirlenen bir programı o kullanıcı için çalıştırır. Sisteme girdikten sonra
kullanıcı için çalıştırılacak program genellikle bir komut yorumlayıcı programdır. Böylece
sisteme girildikten sonra kullanıcı bir komut yorumlayıcı ile karşılaşılır. UNIX sistemlerinde
komut yorumlayıcılar (command interpreter / shell) bir tane değildir. Bir kullanıcı sisteme
girdiğinde hangi komut yorumlayıcının çalıştırılacağı ve kullanıcıya ilişkin diğer bilgiler,
kullanıcı yaratılırken belirlenir ve korunmuş olan bazı dosyaların içerisinde saklanır. UNIX
sistemleri bir süper kullanıcının her türlü işlemi yapabileceği bir sistemdir.
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:47
#2
Süper kullanıcının
kullanıcı ismi “root” biçimindedir. Sisteme süper kullanıcı olarak giren birisi hiçbir güvenlik
engeline takılmadan sistemle ilgili her türlü işlemleri yapabilir. Her türlü dosyaya erişebilir.
UNIX/Linux Sistemlerinde Kullanılan Komut Yorumlayıcı (Shell) Programlar
UNIX/Linux sistemlerinde komut yorumlayıcı programlar işletim sisteminin çekirdek
kısmından ayrıdır ve birden fazladır. Login işlemi ile birlikte sisteme girildiğinde hangi
komut yorumlayıcı programın (shell) çalıştırılacağı kullanıcı yaratılırken belirtilmektedir.
UNIX/Linux sistemlerinde en yaygın olarak kullanılan komut yorumlayıcı programlar
şunlardır:
1) C Shell (csh)
2) Bourne Shell (bsh)
3) Bourne Again Shell (bash)
4) Korne Shell (ksh)
Bu komut yorumlayıcı programlar arasında bazı komut farklılıkları, script dillerinde çeşitli
farklılıklar vardır. Bunlardan en yaygın kullanılanı Linux’ta bash’tir. UNIX sistemlerinde C
Shell de yaygın olarak kullanılmaktadır. Kuşkusuz komut yorumlayıcılar birer sistem
programlarıdır ve yeni komut yorumlayıcılar yazılabilir. Kullanıcı login olduğunda başka
kişiler tarafından yazılmış komut yorumlayıcılar ile de çalışabilir. Komut yorumlayıcılar
işletim sistemi için sıradan birer process’tir. Shell programından çıkmak için (shell
programından çıkıldığında yeniden login programında geri dönülür.) uygun bir shell komutu
girmek gerekir. Bu shell komutunun ismi genel olarak logout’tur.
UNIX/Linux sistemlerinde içsel komut kavramı yoktur. Bütün komutlar aslında birer
çalışabilen dosyadır. Dolayısı ile her türlü komut yorumlayıcıda bu komutlar çalışmaktadır.
UNIX/Linux Dosya Sistemine İlişkin Temel Dizinler
UNIX/Linux sistemlerinin dizin yapısı DOS’ta gördüğümüz yapıya çok benzerdir. Ancak
dizin geçişleri ‘\’ ile değil ‘/’ ile yapılır. Kök dizin tek bir ‘/’ ile temsil edilir. Path sisteminin
oluşturulması aynıdır. Ancak UNIX/Linux sistemlerinde sürücü kavramı yoktur. Bu sistemler
başka dosya sistemlerini kullanabilmektedir, ama başka dosya sistemleri mount işleminden
sonra dizin ağacında bir dizin biçiminde monte edilmektedir. Örneğin içerisinde Windows
yüklü olan bir makineye ayrıca Linux kurduğumuzu düşünelim. Linux içerisinde
Windows’taki C, D ve E sürücülerine erişmek isteyelim. Bu sürücüler Linux dizin ağacının
istenilen bir yerine bir dizin gibi monte edilirler. Sonra biz bu dizinlere geçtiğimizde aslında
Windows’taki sürücülerin kök dizinlerine geçmiş oluruz. Başka bir dosya sistemini
UNIX/Linux sistemlerine monte etme işlemlerine mount işlemi denir.
Tipik bir UNIX/Linux sistemi kurulduğunda kurulum programları tarafından bir dizin ağacı
oluşturulur ve dizinlere uygun programlar yerleştirilir. Tabii bu dizin ağaçları sistemden
sisteme değişebilmektedir ve standart değildir. Ancak pek çok sistemde aşağıdaki gibidir:
/bin dizini çalışabilen dosyaları ve sistem komutlarını barındırır.
/dev dizini aygıt dosyaları için ayrılmıştır.
/etc dizini önemli sistem dosyalarını tutar.
/lib dizini kütüphane dosyalarını barındırır.
/home dizini kullanıcılar için default dizinlerin kök dizinidir.
/mnt dizini mount işlemleri için düşünülmüştür.
/usr dizini çeşitli programlar tarafından kullanılan bir dizindir.
/tmp geçici dosyaların yaratıldığı dizin olarak kullanılır.
Tabii kurulum işlemi ile bu ağaç büyümektedir.
UNIX/Linux Sistemlerinin Kurulumu
UNIX/Linux sistemlerinin kurulumu maalesef Windows sistemlerinden daha zordur. Pek çok
sistemi kurmadan önce boot ve root disketlerinin oluşturulması gerekir ve kuruluma bu
disketlerle başlamak gerekir. Bu disketler Windows ya da DOS ortamında
hazırlanabilmektedir. Bu tür sistemlerde makine boot disketi takılarak disketten açılır. Sonra
root disketinin takılması istenir ve sonra da bir prompt ile karşılaşılır. Bu aşamada setup
programı çalıştırılarak kuruluma başlanır. Ancak UNIX/Linux sistemlerinin çoğunda kurulum
işlemleri kolaylaştırılmıştır. Örneğin doğrudan makine CD’den boot edilerek kurulum
başlatılabilir. UNIX/Linux sistemleri ayrı bir patition’a kurulmalıdır.
UNIX/Linux sistemlerinin eski versiyonlarının çoğu PC’lere kurulduğunda disk bölümleme
tablosunun (partition table) ana dörtlük girişlerinden birini kullanmak ister. Bu sistemler tek
başlarına yüklendiğinde genellikle problemsiz bir biçimde kurulur. Ancak genellikle
makinede zaten bir Windows sistemi vardır ve bu sistemler ikinci bir işletim sistemi olarak
yüklenmek istenir. Bu durumda özellikle extended partition yaratırken, enxtended partition’un
diskin geri kalan tüm alanı kullanması yoluna gidilmemelidir. Yani geri kalan ana girişler için
yer bırakılmalıdır. Eğer tüm disk extended partition için kullanılmışsa extended partition’ı
küçülterek yer açan özel programlar vardır (fibs, partition resizer). Ana girişler için yer
açıldıktan sonra yeni bir UNIX/Linux partition’ı yaratılır. Bu partition için UNIX/Linux
formatı atıldıktan sonra kurulum problemsiz olarak devam eder.
Ancak bu sistemlerin son versiyonları extended partition‘ın logical sürücüleri üzerine de
kurulabilmektedir. Yani örneğin diskin tamamını extended partition olarak kullanmış olalım
ve extended partition içerisindeki mantıksal sürücüler D, E, F, G olsun. Örneğin G sürücüsü
feda edilerek sistem G sürücüsü üzerine de kurulabilir.
İşletim sisteminin kurulmasından sonra en önemli problem makine açıldığında sistemin
istenilen işletim sistemi ile boot edilebilmesidir. Yani makineyi açtığımızda bir yazı çıkacak,
biz de istediğimiz işletim sistemi ile çalışmaya başlayabileceğiz. Bu işlem için Linux
sistemlerindeki Lilo programı kullanılabilir ya da özel boot yöneticisi programlarla bu işlem
yapılabilir. Lilo programı zaten kurulumun son aşamasında bu işlemi yapmak üzere devreye
/bin /dev /etc /lib /home
/mnt
/usr /tmp
girer. Lilo mbr sektörüne ya da Linux’un boot sektörüne yerleştirilebilir. Lilo mbr’ye
kurulduğunda maalesef pek çok durumda buradan silinebilmektedir. Bunun için UNIX/Linux
sisteminin bir açılış disketinin saklanması gerekir.
Virtual PC ve WMware Programları
Virtual PC ve WMware programları NT gurubu ve 98 gurubu işletim sistemlerinde çalışan ve
sanki ayrı bir makinede çalışıyormuş izlenimi veren programlardır.
Bu programlar bir dosyayı sanal bir makinenin hard disk’i olarak görürler ve tamamen orijinal
kodları Windows sistemlerinin çok işlemliliği içerisinde çalıştırırlar. Bu programlar
kullanılarak UNIX/Linux sistemleri sanki ayrı bir makineye kuruluyormuş gibi kurulabilir.
Bu sistemlerde sanal makinenin harddisk’inde yapılan her şey gerçek makinede bir dosyayı
etkilemektedir. Biraz yavaş çalışmalarına karşın deneysel faaliyetler için çok iyi bir ortam
oluştururlar.
Virtual PC programında fare o anda çalışmakta olan işletim sistemi penceresinin içerisine
click yapılırsa sanki o sistemin faresiymiş gibi ele geçirilir. Fareyi tekrar ele geçirmek için
aktif tuşa basmak gerekir. Aktif tuş virtual PC kurulduğunda sağ Alt tuşudur. O andaki
makinenin ekranını tüm ekranı kaplar hale getirmek için aktif tuş + Enter yapmak gerekir.
Temel UNIX/Linux Komutları
UNIX/Linux sistemlerinde içsel komut kavramı yoktur, bütün komutlar aslında birer
programdır ve temel komutların POSIX standartlarında belirlenmiştir. Bu sistemlerde bir
komutun genel yapısı şöyledir:
< komut ismi > [seçenekler] [parametreler]
Seçenekler genellikle -x formatındadır. x burada bir ya da birden fazla karakteri temsil eder.
Bir komut birden fazla seçenek alabilir. Örneğin:
#AD?
Bu tür seçenekler tek bir - içerisinde de yazılabilirler. Örneğin:
#AD?
ls Komutu
Bu komut Dos'taki dir komutuna karşılık gelir. Geniş bir komuttur ve pek çok seçeneği vardır.
ls -l ile dosyalara ilişkin ayrıntılı bilgiler görüntülenebilir.
cat Komutu
Bu komutu Dos'taki type komutu gibidir.
pwd Komutu
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:48
#3
Bu komut o anda çalışılan dizinin hangisi olduğunu görüntüler.
rm ve cp Komutları
Bu komutlar DOS'daki del ve copy komutları gibidir.
more Komutu
Sayfa sayfa type etmekte kullanılır.
mkdir ve rmdir Komutları
Dizin yaratıp dizin silmek için kullanılır.
cd Komutu
Dizin değiştirir.
UNIX/Linux Sistemlerinin Dosya Sistemine İlişkin Temel Bilgiler
POSIX dosya sisteminde dosya isimlerinin büyük/küçük harf duyarlılığı vardır. Örneğin,
ankara isimli dosyayla Ankara isimli dosya aynı anda bulunabilir ve birbirlerinden farklıdır.
Bu dosya sistemi de FAT sisteminde olduğu gibi bir kök dizin ve iç içe geçmiş dizinler
topluluğundan oluşur.
POSIX sistemlerinde orta karmaşıklıkta bir koruma mekanizması uygulanmıştır, yani
dosyalar ve dizinler bunları yaratanların isteğiyle diğer kullanıcılardan gizlenebilmektedir.
Her dosya ve dizine erişim üç durum dikkate alınarak değerlendirilmektedir:
1) Erişimi dosyayı yaratan kişi mi yapmaya çalışmaktadır?
2) Erişim dosyayı yaratan kullanıcının dahil olduğu gruptan herhangi bir kullanıcı tarafından
mı yapılmak istenmektedir? Çeşitli kullanıcılar bir grup altında toplanabilir. Yani erişimde
dosyayı yaratan kişi olmanın yanı sıra yaratan kişi ile aynı grupta olmanın da önemi vardır.
3) Erişimi ne dosyayı yaratan kişi ne de dosyayı yaratan kişi ile aynı grupta olan bir kişi mi
yapmaya çalışmaktadır, yani herhangi bir kullanıcı mı yapmaya çalışmaktadır?
İşte bir dosyaya ya da dizine erişimde bu ölçütlere dikkat edilmektedir. POSIX sisteminde her
dosyanın onu yaratan kişi (owner), yaratan kişinin grubu ve herhangi bir kişi için erişim
hakları vardır. Yani her dosya için o dosya üzerinde kimin hangi işlemleri yapacağı
belirlenmiştir.
Bir dosya üzerinde üç erişim işlemi yapılabilir: okuma, yazma ve çalıştırma. Bir dosyanın
erişim bilgilerini görmenin en kolay yolu ls -l komutunu uygulamaktır. Bu komut
uygulandığında dosyanın tipik erişim bilgisi aşağıdaki gibi olur:
-rw-rw-rw-
Bu erişim bilgisindeki en soldaki karakter dosyanın türünü belirtir. Örneğin bu karakter - ise
dosya sıradan bir dosyadır, d ise bir dizin, p ise bir pipe vs... Sonraki karakterler üçerli
gruplara ayrılır. İlk grup dosyayı yaratan kişi için, sonraki grup dosyayı yaratan kişinin grubu
için, sonraki grup ise herhangi bir kişi için erişim haklarını belirtmektedir. Örneğin,
d rwx rwx rwx
sahibi grup herhangi birisi
Örneğin bir dosyanın erişim bilgileri şöyle olsun:
-rw-r--r--
-,rw-,r--,r--
Dosyayı yaratan kişi buradaki dosya üzerinde hem okuma hem yazma yapabilir, ancak
dosyayı yaratan kişi ile aynı gruptaki kişiler ve diğer kişiler yalnızca okuma yapabilirler.
Bir dosyanın okunabilmesi demek dosya fonksiyonlarıyla okuma işlemlerinin yapılabilmesi
demektir. Bir dosyaya dosya fonksiyonlarıyla yazma, ekleme gibi işlemlerin yapılabilmesi
için yazma hakkının olabilmesi gerekir. POSIX sistemlerinde çalıştırılabilen dosyalar
uzantılarıyla tespit edilmezler, erişim haklarıyla tespit edilirler. Yani dosyanın x erişim
özelliği varsa bu dosya çalıştırılabilir bir dosyadır. İsmi yazıldığında işletim sistemi tarafından
yüklenir. Bir dizin için okuma hakkının olması o dizin için dizin listesinin alınabilmesi
anlamındadır. Yazma hakkının anlamı o dizinde yeni bir dosya yaratma ya da olan bir dosyayı
silme anlamındadır. Çünkü aslında dizinler de birer dosya gibidir. Dizinler için
çalıştırılabilme hakkı tamamen farklı bir anlama gelir, bu hak bir path ifadesinde bir dizinin
içerisinden başka bir dizine atlanabileceğini belirtir. Örneğin, bir dosya açacak olalım ve
dosyanın path bilgisi şöyle olsun:
/a/b/c.dat
Burada biz c.dat dosyasının içeriğini yalnızca okumak isteyelim, yani fopen() fonksiyonu ile
c.dat dosyasını "r+" modunda açmak isteyelim. Burada a dizininin içerisinden geçilmektedir.
Yani a'nın çalıştırılabilir hakkına sahip olması gerekir. c.dat dosyasının okuma ve yazma
haklarına sahip olması gerekir. b'nin okuma ve çalıştırılabilir hakkına sahip olması gerekir,
ancak yazma hakkına sahip olmasına gerek yoktur. Dizinler için böyle bir mekanizma
kurulmasının anlamı şudur: Bir kişi bir dizini korumak isteyebilir ama o dizinin altındaki
başka bir dizini korumak istemeyebilir, bu durumda korumak istediği dizin için okuma ve
yazma hakkı vermez onun alt dizini için okuma ve yazma hakkı verir, ancak üst dizin için
geçiş hakkını vermesi gerekir.
Aşağıdaki path ile verilen fonksiyonu "w+" modunda açmak isteyelim.
/a/b/c/d.dat
Bu durumda a, b, c dizinleri için x hakkının olması gerekir, ancak a ve b için r ve w haklarının
olmasına gerek yoktur. d.dat dosyasının okuma ve yazma hakkına sahip olması gerekir.
Burada c dizininin hangi haklara sahip olması gerekir? Bir dizin için yazma hakkı dizin
içerisinde yeni bir giriş oluşturmak anlamındadır. Yani yukarıdaki örnekte d.dat dosyası daha
önce varsa, yani biz truncate işlemi yapıyorsak, c dizininin yazma hakkına sahip olmasına
gerek yoktur. Ancak d.dat dosyası yoksa dizin içerisinde yeni bir giriş oluşturulacaktır, bu
durumda c'nin yazma hakkına sahip olması gerekir.
Kullanıcı ID Değeri
Bir kullanıcı yaratıldığında bir kullanıcı ismi (user name), bir password ve kullanıcı ismine
karşılık gelen bir kullanıcı ID değeri (user ID) belirlenmektedir. Örneğin kullanıcı ismi "kaan"
ve ID'si "500" olabilir. Kullanıcı ID değeri 0 - 65535 arasında sabit bir değerdir. Her ne kadar
ID değerinin sistem genelinde tek olması zorunlu olmasa da kullanım bakımından sistem
genelinde tek olmalıdır. Bir kullanıcı yaratıldığında kullanıcı ismi, ID değeri ve password
bilgisi /etc/passwd içine text dosyası olarak yazılır. /etc dizini korunmuş bir dizin değildir,
ancak passwd dosyası kurulum programı tarafından kurulum sırasında root kullanıcısı
tarafından yaratılmış bir dosya biçiminde oluşturulur. passwd dosyasının herhangi bir
kullanıcı için sadece okuma hakkı vardır. Yani passwd dosyası bir editörle incelenebilir, ama
içeriği normal bir kullanıcı tarafından değiştirilemez.
Bazı sistemlerde password bilgisi şifrelenmiş olarak passwd dosyası içerisinde yazmaktadır.
Ancak bazı sistemlerde güvenliği arttırmak için password bilgisi okuma hakkı da olmayan
/etc/shadow dosyasında saklanır. passwd ve shadow dosyalarının içeriği ileride ele alınacaktır.
passwd ve shadow dosyaları login işlemi sırasında ve daha pek çok işlem sırasında login
programları tarafından okunmaktadır. Örneğin passwd dosyasında bir kullanıcı için
oluşturulan satır root olarak girilip silinirse kullanıcı sisteme giriş yapamaz.
root kullanıcısının ID değeri 0'dır. Pek çok sistemde 1 - 100 arasındaki değerler reserve
edilmiştir. Kullanıcının ID değeri getuid fonksiyonuyla elde edilebilir ve çeşitli test
işlemlerinde kullanılabilir.
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:49
#4
Grupların ID Değerleri
Kullanıcılarda olduğu gibi her grup için de bir grup ismi ve ID değeri vardır. Bir grup
yaratıldığında grubun ismi, ID değeri ve grup içerisindeki kullanıcıların kimler olduğu
/etc/group dosyasında belirtilmektedir. group dosyası da passwd dosyasında olduğu gibi root
tarafından yaratılmıştır ve diğer kişiler için yalnızca okuma hakkı verilmiştir. Bir kullanıcının
grubuna ilişkin ID değeri getgid fonksiyonuyla elde edilebilir.
UNIX/Linux Process Yapısının Temelleri
UNIX/Linux sistemlerinin process yapısı tamamen hiyerarşik bir yapı göstermektedir. Diğer
işletim sistemlerinde olduğu gibi POSIX sistemlerinde de bir process başka bir programı
çalıştırabilir yani yeni bir process yaratabilir. Yeni çalıştırılan process (child process) ile onu
çalıştıran process (parent process) arasındaki ilişki Windows sistemlerine göre sıkıdır. Klasik
olarak POSIX sistemlerinde her process’in bir ID değeri vardır. Bu ID değeri sistemde tektir.
POSIX sistemleri yüklendiğinde temel yükleme işlemleri için 0 ID numarasına sahip bir
process yaratılır. Bu process init process’ini yaratmaktadır. init process’in ID değeri 1’dir.
Sisteme girmek için kullanılan login de bir programdır, yani bir process olarak çalıştırılır.
Login tipik olarak init process’inin bir alt process’dir (child process). Kullanıcı username ve
password bilgilerini başarılı bir biçimde girdiyse /etc/passwd dosyasında belirtilen shell
programı çalıştırılır.
Yani shell process’i tipik olarak login process’inin alt process’i olarak çalışır. Bu durumda
tipik bir POSIX sisteminde sisteme login olunduğunda process hiyerarşisi şöyle olacaktır. Bu
noktada artık shell üzerinden bir program çalıştırırsak çalışan process shell process’inin bir alt
process’i olarak çalıştırılacaktır. UNIX/Linux sistemlerinde bir process’in yeni bir process’i
çalıştırması fork ve exec fonksiyonları ile yapılmaktadır. Bu sistemlerde yaratılan alt
process’ler üst process’in pek çok bilgisini doğrudan almaktadır. UNIX/Linux sistemlerinin
process yönetimi ileride ayrıca ele alınacaktır.
Process’lerin Erişimlerde Kullandıkları ID Değerleri
Her process’in erişim sisteminde kullandığı beş tür ID değeri vardır.
1) Gerçek kullanıcı ID değeri (real user ID)
2) Gerçek grup ID değeri (real group ID)
3) Etkin kullanıcı ID değeri (effective user ID)
4) Etkin Grup ID değeri (effective group ID)
5) Ek grup ID değerleri (supplementory group ID)
Bu ID değerleri process fork ve exec fonksiyonları ile yaratılırken doğrudan üst process’in
process tablosundan alınmaktadır. Bu ID değerleri yetkin process’ler tarafından
değiştirilebilmektedir.
Sisteme girildiğinde shell process’i normal olarak login process’i tarafından yaratılmıştır.
login process’i username ve password kontrolünü yapıp shell process’ini çalıştırdıktan sonra,
bu process’in gerçek kullanıcı ID değerini ve gerçek grup ID değerini passwd dosyasında
belirtilen değerler ile oluşturur. Sonuç olarak shell process’inin gerçek kullanıcı ID değeri ve
gerçek grup ID değeri kullanıcı yaratılırken belirlenmiş olan ID değerleri olur. Biz shell
üzerinde kendi yazdığımız bir programı çalıştırırken aslında shell process’i komut satırında
belirtilen programı yine fork ve exec fonksiyonları ile çalıştırır. Bu durumda çalıştırılan
programın gerçek kullanıcı ve grup ID değerleri de shell process’inin aynısı olacaktır.
POSIX sistemlerinde erişim kontrolleri gerçek kullanıcı ve grup ID değerleri ile değil etkin
kullanıcı ve grup ID değerleri ile yapılır. Normal olarak çalıştırılan process’in etkin kullanıcı
ve grup ID değerleri gerçek kullanıcı ve grup ID değerleri ile aynıdır. İşte çalıştırılabilen
programların kullanıcı ve grup için iki bayrağı vardır. Eğer bu bayrakları set edilmiş olan bir
dosyadan fork ve exec işlemleri ile bir process yaratılmış ise yaratılan process’in etkin
kullanıcı ve grup ID değerleri o çalıştırılabilen dosyanın sahibinin ve grubunun ID değeri olur
(bu bayrakların set edilmiş olup olmadığı ls –l komutunda x yerine s harfinin görülmesinden
anlaşılır). Örneğin diskte passwd isimli bir program olsun. Programın erişim hakları şöyle
olsun:
#AD?
şimdi eğer bu dosyanın kullanıcı ya da grup bayrakları set edilmemiş ise bu program
çalıştırıldığında yaratılan process’in etkin kullanıcı ve grup ID değerleri bizimkinin aynısı
olacaktır ve bu programın içerisinde bazı öncelikli erişimler yapılıyor ise bu erişimler
başarısız olacaktır. İşte şimdi eğer bu dosyanın kullanıcı ID bayrağı set edilmiş olsa bu
process’in etkin kullanıcı ID değeri dosyanın sahibinin kullanıcı ID değeri yani root olacaktır.
Erişim kontrolüne etkin ID değerleri katıldığı için erişimler gerçekleşecektir. Görüldüğü gibi
çalıştırılabilen dosyaların bu özel bayrakları sanki bu dosyaları dosyanın sahibi gibi
çalıştırılmasını sağlamaktadır. Bu bayrakların set edilebilmesi için erişim hakkına sahip
olmak gerekir. Bu bayrakların set edilmesi chmod komutu ile yapılmaktadır.
Özetle biz root olmasak bile root istedikten sonra root tarafından oluşturulmuş programı root
erişim hakkı ile çalıştırabiliriz.
UNIX/Linux sistemlerinde normal olarak bir kullanıcı tek bir gruba ilişkin olabilir. Yani
process’in gerçek grup ID’si bir tanedir. Ancak bir kullanıcının birden fazla gruba üye olması
faydalı bir durum oluşturduğundan “ek grup ID“ kavramı ile bir kullanıcı birden fazla gruba
aitmiş gibi de gösterilebilmektedir. Her grubun hangi kullanıcılardan oluşturulduğu /etc/group
dosyasında belirtilmiştir. Bu dosyaya bakıldığında bir kullanıcının farklı gruplarda
bulunabileceği görülmektedir. Ancak kullanıcının gerçek grubu /etc/passwd dosyasında
belirtilen gruptur. Bir shell process’i yaratıldığı zaman process’in ek grup ID’leri /etc/group
dosyasından alınarak oluşturulmaktadır. Özetle bir kullanıcının tek bir grup ID’si vardır o da
/etc/passwd dosyasında belirtilendir. Ancak kullanıcı birden fazla gruba ilişkin olabilir o da
/etc/group dosyasında belirtilmektedir. Ek grup ID’leri de erişimde kontrol işlemine
sokulmaktadır.
Erişim Kontrolleri
Edinilen bilgilerden sonra POSIX sistemlerinin uyguladığı erişim kontrolleri sırası ile ele
alınabilir. Örneğin bir process’in bir dosyaya erişmek istediğini düşünelim. Erişim
algoritmasında gerçek kullanıcı ve grup ID’leri değil, etkin kullanıcı ve grup ID’leri ile ek
grup ID’leri test işlemine sokulmaktadır.
1) Erişimi gerçekleştirmek isteyen process’in etkin kullanıcı ID değeri 0 (root) ise erişim
gerçekleştirilir.
2) Dosyanın sahibinin etkin kullanıcı ID değeri ile belirtilen kullanıcı olup olmadığına
bakılır. Eğer dosyanın sahibi process’in etkin kullanıcı ID’siyle belirtilen kullanıcı ise, bu kez
dosya sahipliğinin rwx alanlarına bakılarak erişim hakkının olup olmadığı test edilir. Erişim
hakkı varsa erişim gerçekleşir, yoksa erişim reddedilir ve bir sonraki aşamaya geçilmez.
3) Process’in etkin grup ID’si ile dosyanın ilişkin olduğu grup karşılaştırılır. Eğer dosya
process’in etkin grup ID’si ile belirtilen gruba ilişkin ise dosyanın grup erişim haklarına
bakılır. Bu haklar uygunsa erişim gerçekleştirilir, değilse erişim reddedilir ve sonraki aşamaya
geçilmez.
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:49
#5
4) Process’in ek grup ID’lerinden herhangi birisi dosyanın ilişkin olduğu gruptan mı diye
bakılır. Eğer gruptan ise dosyanın grup erişim hakları incelenir. Erişim hakları uygun ise
erişim gerçekleştirilir. Uygun değilse erişim reddedilir ve sonraki aşamaya geçilmez.
5) Bu aşamada artık process herhangi biri durumuna gelmiştir. Bu nedenle dosyanın
herhangi birine ilişkin erişim haklarına bakılır. Eğer erişim hakkı uygunsa erişim
gerçekleştirilir, değilse erişim reddedilir.
Örneğin aşağıda a isimli çalışabilen dosyanın ve b data dosyasının bilgileri verilmiştir.
-r-sr-xr-x Ali Project1 a
-r--rw-r-- Veli Project1 b
a programının b data dosyasına bir şeyler yazmak istediğini düşünelim. Grubu Project3 olan
Mehmet isimli kullanıcı login olarak a programını çalıştırabilir mi? A programı b dosyasına
yazma yapabilir mi?
1) Mehmet kullanıcısı herhangi bir kişi olarak a dosyasına erişip onu çalıştırabilir.
2) A programı çalışıp process olduğunda a process’inin etkin kullanıcı ID değeri Ali etkin
grup ID değeri Project3’tür. Çünkü a çalışabilen dosyasının yalnızca user ID değeri set
edilmiştir.
3) Bundan sonra a process’inin etkin kullanıcı ID’si b dosyasının ID’si ile uyuşmadığından,
etkin grup ID’si b dosyasının ID’si ile uyuşmadığından ve b dosyasına herhangi bir kişi
yazma işlemi yapamayacağından, sonuç olarak Mehmet kullanıcı a programını çalıştırabilir,
ama a programı b dosyasına yazma yapamaz.
Eğer soruda a çalışabilen dosyasının grup ID bayrağı set edilmiş olsaydı, a process’inin etkin
grup ID değeri Project1 olacağından yazma işlemi yapılabilecekti.
Dosya ve Dizinlerin Sahiplik Bilgilerinin Oluşumu
Dosya yaratmak için fopen standart C fonksiyonu ya da open sistem fonksiyonu kullanılabilir.
Yaratılacak dosyanın sahibi, grubu ya da sıradan kişi için erişim hakları dosya yaratılırken
open fonksiyonunun parametresinde belirlenir. Ancak yaratılmış olan dosyanın kullanıcı ID’si
ve grup ID’si bu fonksiyonlarda belirlenmez. Bu belirleme otomatik olarak yapılır. Yaratılmış
her dosyanın bir kullanıcı ID’si ve grup ID’si vardır. Yaratılan dosyanın kullanıcı ID’si onu
yaratan process’in etkin kullanıcı ID’si olarak belirlenir. Ancak yeni yaratılan dosyanın grup
ID değeri konusunda UNIX versiyonları arasında farklar vardır. Örneğin AT&T SVR4
modellerinde yeni yaratılan dosyanın grup ID’si dosya yaratan process’in etkin grup ID’si
olarak belirlenmektedir. Ancak BSD sistemlerinde yeni yaratılan dosyanın grup ID’si içinde
yaratılma işleminin yapıldığı dizinin grup ID’si olarak belirlenmektedir. Ancak BSD
sistemlerinde daha sonra bu durum dizinin grup ID bayrağının set edilip edilmemesine göre
tespit edilir. POSIX.1 de bu durum isteğe bağlı bir biçimde işletim sistemini yazanlara
bırakılmıştır (Linux sistemlerinde default olarak dosyayı yaratan process’in grup ID değeri
kullanılmıştır).
UNIX/Linux Sistemlerinde Dosya Sistemine İlişkin İşlemler
POSIX sistemlerinde dosya işlemleri üç fonksiyon grubu ile yapılabilir:
1) Standart C fonksiyonları ile yapılabilir. Standart C fonksiyonlarına tamponlanmış
fonksiyonlar (buffered I/O functions) da denilmektedir. Bilindiği gibi standart C fonksiyonları
doğrudan işletim sisteminin aşağı seviyeli dosya fonksiyonlarını çağırarak işlemlerini yapar.
Ancak bir tamponlama mekanizması kullanırlar. Örneğin standart C fonksiyonları ile bir
okuma yapıldığında önce okunan bilgi tamponda mı diye bakılır, tamponda ise alınır,
tamponda değilse tazeleme yapılır ve ondan sonra yine aynı tampondan alınır. Böylelikle
sistemin daha etkin çalışacağı düşünülmüştür. Tabii standart C fonksiyonları işletim sistemine
özgü ayrıntılı dosya işlemleri için yetersizdir.
2) Standart POSIX dosya fonksiyonları ile POSIX.1 de tanımlanmış olan open, close, read,
write gibi aşağı seviyeli fonksiyonlar vardır. Bu fonksiyonların yetenekleri daha fazladır.
POSIX fonksiyonları bazı sistemlerde doğrudan sistem fonksiyonu konumunda olabilir ya da
bu fonksiyonlar da gerçek sistem fonksiyonlarını çağıran arabirim fonksiyonlar olabilir.
3) Gerçek sistem fonksiyonlarının çağırılması ile yapılabilir. İşletim sisteminin gerçek sistem
fonksiyonları standart değildir ve pek çok sistemde tasarım tekniği farklı olabilir.
UNIX/Linux programlamada eğer hızlı, ayrıntısı olmayan, fakat çok taşınabilir kodlar
yazılmak istenirse o zaman doğrudan standart C fonksiyonlarının kullanılması en iyi
seçenektir. Ancak POSIX sistemlerine özgü işlemler yapılacaksa o zaman POSIX
fonksiyonları tercih edilmelidir. Doğrudan sistem fonksiyonlarının kullanılması için çok az
gerekçe vardır. Standart C kütüphanesi aynı zamanda POSIX standartlarında da geçerli bir
kütüphanedir.
Temel dosya işlemlerinin dışında POSIX sistemlerinde dosya sistemine ilişkin bir takım
faydalı işlemler için standart POSIX fonksiyonları da vardır. Örneğin dizin dosya silme, dizin
değiştirme, dosyanın ismini değiştirme gibi işlemler için standart POSIX fonksiyonları
kullanılır.
Dosya Sistemi ile İlgili İşlem Yapan Yardımcı POSIX Fonksiyonları
Bu fonksiyonların bir kaç istisnası dışında hepsinin geri dönüş değeri int türündendir ve
başarıyı anlatmaktadır. Fonksiyonlar başarılı olduğu zaman 0 değerine başarısız olduğu
zaman –1 değerine geri dönerler. Başarısızlık durumunda kütüphanede bulunan errno isimli
global değişken set edilir. errno içerisindeki değer başarısızlığın nedenini belirtmektedir. Bu
fonksiyonların çoğunun prototipleri unistd.h dosyası içerisindedir. Fonksiyonların kullandığı
çeşitli tür isimleri sys/types.h dosyasında bildirilmiştir. Ancak her fonksiyonun gereksinim
duyduğu başlık dosyaları ayrıca belirtilecektir.
errno Değişkeni, strerror ve perror Fonksiyonları
Standart C fonksiyonlarının bazıları ve POSIX fonksiyonlarının çoğu başarısızlık durumunda
–1 değerine geri dönerler. Ancak bu fonksiyonlar başarısızlığın nedenini geri dönmeden önce
kütüphanedeki errno isimli global bir değişkene yazarlar. errno errno.h dosyası içerisinde
extern olarak bildirilmiştir. Bu değişkenin global tanımlaması kütüphane içerisinde
yapılmıştır. errno int türden bir değişkendir. Hata oluştuktan sonra errno içerisindeki her bir
değer faklı bir hata durumunu anlatmaktadır. Bu sayısal değerler aynı zamanda EXXX
biçiminde sembolik sabitler olarak errno.h içerisinde define edilmiştir. Böylece errno
değişkeninin karşılaştırılmasında sembolik sabitler kullanılır.
if (errno == ENOEND) {
//...
//...
}
Bir hata oluştuğunda hata olasılıklarının ne olduğu POSIX içerisinde dokümante edilmiştir.
Örneğin bir dosyanın açılamadığını düşünelim; dosyanın açılamamasının belirli sayıda nedeni
vardır. Ancak programcılar oluşan hata için bir mesaj metni yazdırmak isterler ve bu da
yardımcı fonksiyonlar kullanılmadan zor yapılacak bir işlem değildir. strerror fonksiyonu hata
numarasını, yani errno değişkeni içerisindeki sayıyı parametre olarak alır ve mesaj metnine
geri döner. Prototipi string.h dosyası içerisindedir.
char *strerror(int errno);
Fonksiyon static yerel bir dizinin adresi ile geri dönmektedir. Örneğin fonksiyon şöyle
kullanılabilir:
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:50
#6
if (open(...) == -1) {
pMessage = strerror(errno);
puts(pMessage);
exit(1);
}
perror fonksiyonu doğrudan errno global değişkenine bakarak mesaj metnini stdout dosyasına
yazdıran kullanışlı bir fonksiyondur. Prototipi stdio.h dosyası içerisindedir.
**** perror(const char *pMsg);
Fonksiyon önce parametresi ile belirtilen yazıyı yazar, sonra : karakterini yerleştirir, sonra da
errno değişkenine karşılık gelen mesaj metni yazdırır, en sonunda ‘\n’ ile aşağı satıra geçiş
yapılır. Örneğin;
if (open(...) == -1) {
perror(“Error”);
exit(1);
}
unlink ve remove Fonksiyonları
Bu fonksiyonlar dosya silmek amacı ile kullanılır ve ikisi tamamen eşdeğerdir. remove
fonksiyonunun prototipi stdio.h içerisinde unlink fonksiyonunun unistd.h içerisindedir.
int unlink(const char *path);
int remove(const char *path);
Bu fonksiyonlar dosyanın bağlantı sayısını bir azaltır. Eğer bağlantı sayısı 0’a düşmüşse
dosyayı fiziksel olarak silerler. Dosya bağlantıları ileride ele alınacaktır. Fonksiyonlar başarılı
ise 0’a, başarısız ise –1 değerine geri dönerler. Bu fonksiyonlar ile dizinler silinemez. remove
fonksiyonu Dos ve Windows sistemlerinde aynı biçimde vardır. Aynı zamanda standart C
fonksiyonudur.
rename Fonksiyonu
Bu fonksiyon dosyanın ismini değiştirmek için kullanılır. Aynı zamanda standart C
fonksiyonudur. Prototipi stdio.h içerisindedir.
int rename(const char *oldname, const char *newname);
Fonksiyon başarısızlık durumunda –1 değerine başarılı olma durumunda 0 değerine geri
dönerler.
chdir Fonksiyonu
Bu fonksiyon o andaki geçerli dizini değiştirmekte kullanılır. Geçerli dizin (current working
directory) göreli path verildiğinde göreli path ifadesinin nereden başlatılacağını
belirlemektedir. Fonksiyonun prototipi unistd.h içerisindedir.
int chdir(const char *path);
Fonksiyon başarısızlık durumunda –1, başarı durumunda 0 değerine geri döner.
getcwd Fonksiyonu
Bu fonksiyon o anda çalışılan dizini path ifadesi olarak elde etmekte kullanılır. Prototipi
unistd.h içerisindedir.
char *getcwd(char *path, size_t size);
Fonksiyonun birinci parametresi path bilgisinin doldurulacağı dizinin adresi, ikinci
parametresi dizinin uzunluğudur (Yani fonksiyon en fazla size-1 karakter yerleştirir).
Fonksiyon başarı durumunda birinci parametresinde belirtilen adrese, başarısızlık durumunda
NULL değerine geri döner.
/* getcwd.c */
#include < stdio.h >
#include < unistd.h >
#include < stdlib.h >
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 değeri bilinen bir dosyanın bilgilerini elde etmek için
kullanılırlar. Bu fonksiyonların prototipleri sys/stat.h dosyası içerisindedir. Ancak bu
fonksiyonları kullanırken çeşitli typedef isimlerine de gereksinim duyulur. Bu tür isimleri
sys/types.h içerisinde belirtilmiştir. Bu nedenle bu fonksiyonları kullanabilmek için bu iki
dosya include edilmelidir.
int stat(const char *path, struct stat *buf);
int fstat(int filedes, struct stat *buf);
Bu iki fonksiyon da tamamen aynı işlemleri yapar. stat fonksiyonu dosyanın path bilgisi ile
fstat handle değeri ile çalışır. Yani fstat fonksiyonunu kullanabilmek için önce dosyanın aşağı
seviyeli open fonksiyonu ile açılmış olması gerekir. Fonksiyonlar başarı durumunda 0
değerine, başarısızlık durumunda –1 değerine geri dönerler ve errno set edilir. stat isimli yapı
sys/stat.h içerisinde bildirilmiştir. Fonksiyonların ikinci parametresi bu türden bir yapı
nesnesinin adresini alır.
Bilgisi elde edilecek dosya bilgiyi elde etmek isteyen process’e erişim bakımından kapalı olsa
bile yine dosya bilgileri elde edilir. Yani dosya r ve w özellikleri ile erişime kapalı olsa bile
yine de bilgileri elde edilir. Ancak dosya hangi dizinin içerisindeyse o dosyaya giden path
ifadesindeki dizinlerin erişecek process için x haklarının olması gerekir. stat yapısının
elemanları şu anlamları içerir:
1) dev_t st_dev:
dev_t türü genellikle unsigned short int biçimindedir ve dosya bir aygıt dosyası ise onun
numarasını belirtir.
2) ino_t st_ino:
ino_t unsigned long int türündendir ve dosyanın inode numarasını barındırır.
3) mode_t st_mode:
Bu dosyanın bildiğimiz rwx erişim haklarıdır. mode_t unsigned short türündendir. Bu eleman
aynı zamanda ilgili dosyanın türünü belirlemek için de kullanılır.
4) nlink_t st_nlink:
nlink_t genellikle unsigned short türündendir. Burada dosyanın toplam link sayısı vardır.
5) uid_t st_uid:
uid_t unsigned short türündendir. Dosyanın kullanıcı ID’sini belirtir.
6) gid_t st_gid:
Dosyanın erişim testinde kullanılan grup ID değerini verir. gid_t unsigned short türündendir.
7) dev_t st_rdev:
Özel dosyalar için aygıt numarasını verir.
8) off_t st_size:
off_t long türündendir. Bu eleman dosyanın byte uzunluğunu verir.
9) long st_blksize:
Bu eleman dosya için tahsis edilecek en iyi blok büyüklüğünü belirtir.
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:51
#7
10) long st_blocks:
Bu eleman dosya için tahsis edilen toplam blok sayısını içerir.
11) time_t st_atime, st_mtime, st_ctime:
POSIX dosya sisteminde dosya zamanına ilişkin burada belirtilen üç bilgi ayrı ayrı tutulur.
Sırası ile bu zamanlar en son erişim zamanı, en son değiştirme zamanı ve dosya durumunun
en son değiştirilme zamanıdır (FAT sisteminde yalnızca en son değiştirme zamanı
tutulmaktadır).
/* mcopy –t /home/student/stat.c a: */
/* stat.c */
#include < stdio.h >
#include < stdlib.h >
#include < sys/types.h >
#include < sys/stat.h >
int main(int argc, char *argv[])
{
struct stat status;
if (argc != 2) {
fprintf(stderr, "Wrong number of argument");
exit(1);
}
if (stat(argv[1], &status) == -1) {
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 Türünün Belirlenmesi
Genel olarak POSIX sistemlerinde bir dosya normal sıradan bir dosya olabilir, bir dizin
dosyası olabilir, özel karakter dosyası olabilir, özel blok dosyası olabilir, socket ya da FIFO
dosyalar olabilir. Dosyanın erişim bilgileri ve türü stat yapısının unsigned short türden
st_mode elemanına bit olarak kodlanmıştır. Ancak bu bit kodlama işlemi sistemden sisteme
değiştiği için taşınabilirliği sağlamak amacı ile özel makrolar kullanılmalıdır. st_mode
elemanı bu makroya sokulur, makrodan sıfır değeri elde edilirse dosya ilgili türden değil, sıfır
dışı bir değer elde edilirse dosya ilgili türdendir. Kullanılan makrolar şunlardır:
S_ISREG
S_ISDIR
S_ISCHR
S_ISBLK
S_ISFIFO
Örneğin bir dosyanın dizin olup olmadığı aşağıdaki işlemle anlaşılabilir.
if (S_ISDIR(status.st_mode)) {
//...
//...
}
Dosyanın erişim hakları için de & işlemine sokulabilecek aşağıdaki sembolik sabitler
tanımlanmıştır:
S_IRUSR
S_IWUSR
S_IXUSR
S_IRGRP
S_IWGRP
S_IXGRP
S_IROTH
S_IWOTH
S_IXOTH
st_mode değeri buradaki sembolik sabitlerle & işlemine sokularak ilgili özelliğin olup
olmadığı anlaşılır. Örneğin:
if (status.st_mode & S_IWUSR) {
//...
}
Burada dosyanın sahibine yazma hakkı verilip verilmediği test edilmek istenmiştir.
DOS ve Win32 Sistem Programcıları için Not: stat fonksiyonu DOS’taki findfirst,
Win32’deki FindFirstFile fonksiyonlarına işlevsel olarak benzemektedir. Bilindiği gibi bu
fonksiyonlar dosya bilgilerinin dizin girişlerinden alıp ffblk ya da WIN32_FIND_DATA
türünden yapılar içerisine doldururlar.
UNIX/Linux Sistemlerinin Disk Organizasyonunun Temelleri
AT&T tabanlı UNIX işletim sistemlerinin dosya sistemi s5fs (System 5 File System) ismiyle
anılır. Berkeley (BSD) sistemleri klasik UNIX dosya sistemine bazı yenilikler getirmiştir.
Berkeley tabanlı bu dosya sistemine FFS/UFS (Fast File System / UNIX File System)
denilmektedir. Linux sistemlerinde çeşitli eklentiler yapılmıştır. Şu anda Linux sistemlerinin
yaygın olarak kullandığı dosya sistemi ext2 (Second Extention File System) denir.
DOS ve Win32 Sistem Programcıları için Not: Klasik DOS'un dosya sistemi FAT ismiyle ile
anılır. Win95 ile birlikte bu sistem uzun dosya isimlerini içerecek biçimde genişletilmiştir. Bu
dosya sistemi VFAT biçiminde isimlendirilmiştir. OS/2 sistemleri HPFS isimli farklı bir
dosya sistemi kullanırlar. Nihayet Windows NT'lere özgü ayrıntılı bir dosya sistemi de
kullanılmaktadır. Bu sistemler NTFS ismi ile anılır.
Dosya sistemlerinin incelenmesi iki aşamada yapılmalıdır.
1) Kullanıcı gözüyle incelenmesi: Bu inceleme dosya sisteminin kullanıcılar tarafından nasıl
kullanılacağını anlamak ile ilgilidir. Yani dosya sisteminin dış dünyadan nasıl gözüktüğünün
anlaşılmasıdır. İşletim sisteminin dışsal görüntüsünün tamamı resmi olarak sunduğu dosya
sistem fonksiyonları kadardır.
2) Dosya sisteminin disk organizasyonunun incelenmesi: Dosya sistemi aslında aşağı
seviyeli bir disk organizasyonuna dayanır. Bu inceleme klasik kullanıcı ya da programcılar
için önemli değildir. Ancak aşağı seviyeli programlama ile uğraşan sistem programcıları için
disk organizasyonunun bilinmesi önemlidir. Disk organizasyonu bilinmeden bazı kavramların
anlaşılması da zor olmaktadır.
Bilindiği gibi tipik bir FAT sisteminin disk organizasyonu aşağıdaki gibidir.
Boot Sector
FAT(1)
FAT(2)
ROOTDIR
DATA
FAT dosya sisteminde boot sektör içerisindeki BPB alanı diskin kritik bilgilerini tutmaktadır.
Dosya içerikleri DATA bölümünde cluster'larda saklanmaktadır. Bir cluster ardışık n sektör
uzunluğundadır n sayısı BPB bloğunda yazmaktadır.
Yukarıda sözü edilen UNIX/Linux dosya sistemlerinin disk organizasyonu birbirlerine çok
benzerdir. Tipik UNIX/Linux dosya sistemlerinin dosya organizasyonu diski dört bölüme
ayrıdır.
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:53
#8
Boot Sector
Super Block
i-node Block
Data Block
Boot sektör işletim sisteminin yüklenmesinde kullanılan sektördür. Boot sektörü hemen süper
blok sektörleri izler Süper blok içerisinde disk organizasyonuna ilişkin kritik bilgiler
tutulmaktadır. Süper blok görev bakımından tamamen FAT dosya sistemindeki boot sektör
BPB bloğu gibidir. UNIX/Linux dosya sistemlerinde de dosyanın parçaları ardışık sektörlerde
tutulur. Ancak FAT sistemindeki gibi "cluster" biçiminde değil "block" biçiminde
isimlendirilmektedir. i-node blokları i-node elemanlarından oluşur. Her i-node elemanı bir
dosya bilgisini tutar.
Yararlı POSIX komutları: df komutu dosya sistemindeki toplam blok sayısını, ne kadar
bloğun kullanıldığını ve ne kadar bloğun boş olduğunu görmek amacı ile kullanılır.
Bir i-node elemanı içerisinde hangi bilgiler vardır? Dosyaya ilişkin dosyanın ismi dışındaki
bütün bilgiler i-node elemanında saklanır. Örneğin dosyanın erişim bilgileri, zaman bilgileri,
hangi kullanıcıya ve gruba ilişkin olduğu, dosyanın datalarının hangi bloklarda olduğu
bilgileri burada tutulmaktadır. stat ve fstat fonksiyonları dosya bilgilerini i-node
elemanlarından almaktadırlar. i-node elemanlarında dosyanın ismi tutulmaz. Bir dosyanın inode
numarası dosyanın en önemli bilgilerindendir. Bilindiği gibi stat fonksiyonu dosyanın inode
numarasını da vermektedir. POSIX standartlarında dosyanın i-node numarasına kısaca
dosya numarası denilmektedir. Dosya seri numarası POSIX fonksiyonlarında kullanılan bir
kavramdır. POSIX standartları yalnızca UNIX/Linux türevi olan sistemler için
düşünülmemiştir. Herhangi bir sistem bir POSIX ara yüzü sağlayabilir. Bu durumda bu
sistemler farklı disk organizasyonları kullanabilecekleri için dosya numarası kavramını nasıl
üretirler? İşte bu sistemler sırf POSIX uyumunu sağlamak için dosyalar için birer dosya
numarası uydurabilmektedir. i-node bloğunda ilki sıfırdan başlamak üzere her i-node
elemanına bir numara verilmiştir. Dosya numarası ya da dosyanın i-node numarası demekle o
dosyanın bilgilerinin kaçıncı i-node elemanında saklandığı anlaşılmaktadır.
UNIX/Linux sistemlerinde de tıpkı FAT dosya sisteminde olduğu gibi dizin ile dosya
kavramlarının organizasyonları arasında fark yoktur. Normal dosyaların içerisinde bizim
oluşturduğumuz bilgiler vardır. Dizin dosyaların içerisinde de dizin içerisindeki dosyaların
bilgileri bulunur. Bir dizin dosyasının içeriği iki elemanlı kayıtlar biçimindedir.
i-node no Dosya ismi
Bu durumda bir dizin dosyasının içerisi tipik olarak şöyle olacaktır:
i-node Dosya ismi
i-node no Dosya ismi
i-node no Dosya ismi
Burada her bir kayıt kaç byte uzunluktadır? Bu durum sistemden sisteme değişebilmektedir. inode
numarası için genellikle 4 byte yer ayrılır. Klasik UNIX sistemlerinde dosya ismi 14
karakter uzunluğundaydı. Ancak bu gün pek çok sistemde dosya isimleri 256 karakter
olabilmektedir. Bu sistemde bir dosyanın içeriğine erişilebilmesi için önce o dosya dizin
girişlerinde aranmalı ve i-node numarası elde edilmeli sonra i-node bloklarına gidilerek iC
ve Sistem Programcıları Derneği
node bilgileri ele geçirilmeli. Tabii bu sistemde root dizininin yeri bilinmek zorundadır.
Gerçekten de POSIX sistemlerinde root dizininin i-node numarası sıfırdır. Örneğin stat
fonksiyonu ile C/D/E/F/g.dat dosyasının bilgilerini alacak olalım. Burada stat fonksiyonu root
dizininden hareketle sırasıyla dizinlerin içerisinden geçecek ve en sonunda dosyayı bulacaktır.
Tasarımda bu işlem kendi kendini çağıran fonksiyonlarla kolayca yapılabilir.
UNIX/Linux sistemlerindeki en önemli özelliklerden birisi link kavramıdır. Link bir dosyaya
farklı bir dizinden farklı bir isimle erişmek anlamına gelir. Şöyle ki, farklı dizinlerdeki farklı
isimli iki dosyanın i-node elemanları aynı olursa bu iki dosya aslında aynı dosyalardır. İsimler
yalnızca bir semboldür. Bir dosyanın yeni bir linkinden oluşturmak için link sistem
fonksiyonu kullanılır.
int link(const char *oldname, const char *newname);
Fonksiyonun prototipi unistd.h içerisindedir. Başarı durumunda 0, başarısızlık durumunda -1
değerine geri döner. Bir dosyanın bir link'i oluşturulduğunda artık orijinali ile linki arasında
ayırt edici hiç bir özellik kalmaz. Yani orijinal kopya ve link kavramları yoktur, iki bilgi
tamamen eş değer düzeyde tutulmaktadır. Bir dosyanın kaç link'e sahip olduğu dosyaya
ilişkin i-node elemanında da tutulmaktadır. Bilindiği gibi bu bilgi stat ya da fstat fonksiyonları
ile alınabilir. Dosyanın linklerinin sayısı ls -l shell komutuyla da alınabilir. Bir dosyayı silmek
için yalnızca unlink isimli bir fonksiyon vardır. unlink fonksiyonu silinmek istenen dosyanın
i-node elemanına bakar, onun link sayısını bir eksiltir. Link sayısı sıfıra düşmedikten sonra
unlink fonksiyonu yalnızca dizin girişini silmektedir. Ancak link sayısı sıfıra düştüğünde
unlink gerçek silmeyi yapar. Dizinler için link sayısı dizin yaratıldığında ikiden başlar. Çünkü
aslında link sayısı ilgili i-node elamanına referans eden dizin girişlerinin sayısıdır. Bir dizin
yaratıldığında hem yaratılan dizinin içerisinde referans oluşacak hem de yaratılmış olan
dizinde oluşturulan '.' dosyası için bir referans oluşacaktır. Yeni yaratılan dizin içerisinde
yaratılan her dizin için dizinin link sayısı bir artar. Çünkü alt dizinlerin '..' isimli dosyaları da
üst dizinin i-node elemanına referans etmektedir.
Bir dosyanın toplam link sayısı i-node elemanında yazar. Zaten bu nedenle stat fonksiyonu ile
elde edilebilmektedir. Ancak bir dosyanın bütün linklerinin isimleri pratik bir biçimde
bulunamaz. Bunun için bütün dizin ağacının dolaşılması gerekir.
UNIX / Linux sistemlerinde Dizin Dolaşma İşlemleri
UNIX/Linux sistemlerinde dizin dolaşma işlemleri için opendir, readdir ve closedir
fonksiyonları kullanılmaktadır. Bu fonksiyonlar POSIX standartlarında belirtilmiştir,
dolayısıyla pek çok sistem tarafından desteklenmektedir. Bu dosyaların prototipleri dirent.h
dosyası içerisindedir.
DOS ve Win32 Sistem programcıları için not: DOS'ta bu işlemi yapan fonksiyonlar findfirst
ve findnext, Win32'de FindFirstFile ve FindNextFile'dır.
POSIX sistemlerinde önce opendir fonksiyonu ile bir handle alınır, sonra readdir her
çağırıldığında yeni bir dizin girişi elde edilir.
DIR *opendir(const char *name);
Fonksiyonun parametresi içeriği elde edilecek dizin ismidir. Örneğin "/home/kaan" gibi
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:54
#9
perror("chdir");
return;
}
}
#if 1
**** 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 < path >\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 < iostream >
#include < cstdlib >
#include < string >
#include < vector >
#include < algorithm >
#include < cstdio >
#include < dirent.h >
using namespace std;
int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dinfo;
vector< string > dirlist;
if (argc == 1) {
cerr < < "Usage mydir < dir name >\n";
exit(1);
}
if (argc > 3) {
cerr < < "too many arguments!\n";
exit(2);
}
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< string >(cout, "\n"));
closedir(dp);
}
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.
mezardeşen - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
06/2008
Nereden:
izmir
Mesajlar:
322
Konular:
57
Teşekkür (Etti):
7
Teşekkür (Aldı):
42
Ticaret:
(0) %
15-08-2009 16:56
#10
Blok Kavramı
UNIX/Linux sistemlerinde bir dosyanın parçası olabilecek en küçük tahsisat birimine blok
denilmektedir. Blok kavramı FAT ve VFAT dosya sistemlerindeki cluster kavramıyla aynı
anlamdadır.
DOS veWin32 Sistem Programcıları İçin Not: FAT ve VFAT sistemlerinde bir cluster'ın kaç
sektörden oluştuğu boot sektör içerisindeki BPB alanında belirtilmektedir.
Bir bloğun kaç sektör olduğu bazı UNIX sistemlerinde sistemin kurulumu ya da dosya
sisteminin oluşturulması sırasında belirlenebilmektedir. Bazı sistemlerde belirleme yapılmaz.
UNIX sistemlerinde 1 blok = 2 sektör = 1024 byte'tır. UNIX/Linux sistemlerinde de bütün
disk sıfırdan başlayarak bloklara ayrılmıştır. Her bloğun bir numarası vardır.
UNIX/Linux sistemlerinde blok analizi için tipik olarak df ve du komutları kullanılmaktadır.
df komutu dosya sistemindeki toplam blok sayısını, tahsis edilmiş ve kullanılabilir blok
sayılarını vermektedir. du komutu ise recursive olarak belirlenen dizinden itibaren dibe inerek
tüm dizinlerin kaçar blok uzunlukta olduğunu bilgisini vermektedir. du komutu dizin dolaşma
fonksiyonları ile yazılmıştır. Dolayısıyla erişim hakkı yetersizliğinden dolayı bir dizine
geçilemez ise error mesajını stderr dosyasına yazar.
C ve C++ programcıları için not: C'de stdin klavyeyi, stdout ekranı ve stderr de error
dosyalarını temsil eder. C++'ta cout nesnesi stdout dosyası ile, cin nesnesi stdin dosyası ile ve
cerr nesnesi stderr dosyası ile ilişkilidir. Default olarak sistemlerde stderr dosyası stdout
dosyasına yönlendirilmiş durumdadır. DOS'ta komut satırında > yönlendirme işlemi yalnızca
stdout dosyasını yönlendirir. Örneğin DOS'ta den.exe > x biçiminde bir programı
çalıştırdığımızda programın stdout dosyasına yazdıkları x dosyasına aktarılır, ancak stderr
dosyasına yazdıkları ekrana çıkmaya devam eder. Aynı durum UNIX/Linux sistemleri için de
geçerlidir.
UNIX/Linux sistemlerinde shell üzerinden stderr dosyası 2 > sembolü ile herhangi bir dosyaya
yönlendirilebilir. Bazı UNIX/Linux komutları çeşitli error mesajları oluşturmaktadır. Bu error
mesajlarından kurtulmak için stderr dosyası yönlendirilebilir. Bu tür yönlendirmeler için özel
/dev/null dosyası tasarlanmıştır. Bu dosya gerçek bir dosya değildir gelen bilgileri siler.
du 2 > /dev/null
mount İşlemi
DOS ve Windows sistemlerinde dosya sistemleri sürücü kavramı altında kullanıcıya
sunulmaktadır. Bu sistemler heterojen dosya sistemlerini farklı sürücüler olarak
gösterebilmektedir. Ancak UNIX/Linux sistemlerinde sürücü kavramı yoktur. mount işlemi
ile bir dosya sisteminin kök dizini önceden yaratılmış olan bir dizin ile çakıştırılarak o
noktaya monte edilebilmektedir. mount edebilmek için kesinlikle bir dizinin yaratılmış olması
gerekir. mount edilen nokta ve bu noktanın aşağısındaki tüm ağaç mount işleminden sonra
erişilebilirlik özelliğini kaybeder. Bu nedenle genellikle mount işlemleri için ayrı dizinler
yaratmak gerekir. mount işlemi mount sistem fonksiyonu ile yapılabilir ya da doğrudan
çalıştırılabilen bir mount programı da sağlanmıştır. mount işlemi sistemin bütünlüğü
bakımından önemli bir işlemdir bu nedenle bu işlemi ancak root kullanıcısı yapabilir. mount
komutunun basit biçimi şöyledir:
mount < düğüm noktası > < mount noktası >
mount işlemi UNIX/Linux sistemlerinde her aygıt ve dosya sistemi /dev dizinindeki sembolik
bir dosya ile temsil edilir. Örneğin floppy disket dev/fd0 ile, birinci sabit diskin disk bölmeleri
/dev/hda1, /dev/hda2 ile temsil edilmektedir. Örneğin floppy aşağıdaki gibi mount edilebilir.
mount /dev/fd0 /usr/floppy
mount komutu düğüm noktası ile belirtilen sürücüdeki dosya sistemini otomatik olarak tespit
etmeye çalışır. mount komutuna -t switch'i eklenebilir. Bu switch'i dosya sistemine ilişkin tür
bilgisi izlemelidir. Örneğin:
mount -t vfat /dev/fd0 /usr/floppy
Sistem açıldığında gördüğümüz kök dosya sistemi de aslında mount işlemi ile elde edilmiştir.
mount işlemi umount işlemi ile kaldırılabilir (mount edilen aygıt üzerinde işlemler devam
ediyorsa umount işlemi yapılamaz). Örneğin:
umount /usr/floppy
UNIX/Linux Sanal Dosya Sistemi (VFS)
UNIX/Linux sistemlerinde donanım aygıtları (sabit disk, disket sürücü, fare, seri port, paralel
port ...) birer dosya olarak işlem görür. Bütün bu aygıtlar temel sistem fonksiyonları olan
open, close, read ve write fonksiyonları ile yönetilebilirler. UNIX/Linux sistemlerinde
üzerinde çalışılan aygıt ne olursa olsun aygıta temel sistem fonksiyonları ile hep aynı biçimde
erişilir. Sistemin aygıt bağımsız dosya işlemlerini gerçekleştiren bölümüne sanal dosya
sistemi (Virtual File Sytem) denilmektedir. UNIX/Linux sistemleri 80'li yıllardan itibaren
nesne yönelimli programlama tekniğinden etkilenmiştir. Sanal dosya sistemi çok biçimli
(polimorfik) bir tasarım yapısına sahiptir. Yani programcı open ya da read fonksiyonunu
kullanırken bu işlemler gerçekte ilgili aygıt sürücüsünün open ya da read fonksiyonlarını
çağırır.
Bilindiği gibi bir process yaratıldığında işletim sistemi process'e ilişkin kritik bilgileri bir
process tablosunda saklamaktadır (Win32 sistemlerinde process tablosuna process veritabanı
(process database) denilmektedir). Programcı process üzerinde işlemler yapmak isterse
process tablosuna erişmekte kullanılan bir handle değerinden faydalanır. Process'in handle
değeri işletim sistemlerinde process'i çalıştıran kişi tarafından doğal olarak elde edilir.
Çalışmakta olan başka process'lerin handle değerleri işletim sisteminin sağladığı çeşitli
fonksiyonlarla elde edilebilmektedir.
Process'e ilişkin process tablosunda pek çok bilgi tutulmaktadır. Bu konudan process yönetimi
kısmında bahsedilecektir. Ancak konu ile ilgili olarak bazı açıklamalar burada yapılacaktır.
Process'in kullanmakta olduğu dosyalar bir biçimde işletim sistemlerinde process tablosunda
tutulmaktadır.
Popüler işletim sistemlerinde dosyalara erişmek için bir handle değeri kullanılır. Win32
sistemlerinde bu değere "File Handle" UNIX/Linux sistemlerinde dosya betimleyicisi (File
Descriptor) denilmektedir. Bir dosya açıldığında işletim sistemi dosya işlemlerini
yönetebilmek için bir alan tahsis eder. Dosyaya erişim için gerekli bilgileri o alana yerleştirir.
Bu alana genellikle dosya nesnesi (file object) denilmektedir. Programcı dosyayı açtığında
handle değeri olarak dosya nesnesinin adresini elde etmez. İşletim sistemi dosya nesnesinin
adresini dosya tablosu denen bir tabloya yazar.
Handle değeri olarak bu tablodaki satır numarasını verir. Dosya tabloları process'e özgüdür ve
girişi process tablosu içerisindedir. Bu tasarım biçimi popüler pek çok işletim sisteminde aynı
biçimde kullanılmaktadır. Örneğin UNIX/Linux sistemleri ile Win32 sistemleri bu bakımdan
benzer tasarıma sahiptir. Örneğin UNIX/Linux sistemlerinde open sistem fonksiyonunu
çağırarak bir dosya açmış olalım ve bize handle değeri olarak (dosya betimleyicisi olarak) 18
değeri verilmiş olsun. Şöyle bir şekil oluşur.
Dosya
Tablosu
Göstericisi
Dosya Tablosu
Dosya Nesnesi
Process Tablosu
(Process Database)
Process ID
Dosya
Betimleyicisi
--------------------- Bayrakları bayrak yapan üstündeki kandır
Toprak,eğer uğrunda ölen varsa vatandır.

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler