UNIX Türevi Sistemlerde Temel Dosya Fonksiyonları: open, close, read, write ve lseek

Benzer belgeler
10. DOSYA GİRİŞ ÇIKIŞ FONKSİYONLARI

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

UNIX/Linux ve Windows Sistemlerinde Dosyaların ve Dizinlerin Silinmesi

ALGORİTMA VE PROGRAMLAMA II

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

Temel Bilgisayar Programlama

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

Temel Dosya İşlemleri. Kütük Organizasyonu 1

Proses. Prosesler 2. İşletim Sistemleri

ALGORİTMA VE PROGRAMLAMA II

PROSESLER. Proses. Proses

şeklinde tanımlanmıştır. O halde, dosyaları daha önceki bilgilerimizi kullanarak FILE *Dosya1, *Dosya2;

Genel Programlama II

C Programlama Dilininin Basit Yapıları

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

Dr. Fatih AY Tel: fatihay@fatihay.net

DOSYA İŞLEMLERİ Programlama dilleri hafta -

BMB1002 Bilgisayar Programlamaya Giriş. Dosyalar. Prof. Dr. Necmettin Kaya

Eln 1002 Bilgisayar Programlama II

Dosyaların Özellikleri (Attribute) Dosya İşlemleri. İki Seviyeli Katalog Sistemleri. Tek Seviyeli Katalog Sistemleri. Hiyerarşik Katalog Sistemleri

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-8 Dosya İşlemleri-1. Yrd. Doç. Dr. Ümit ATİLA

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

Visual Basic 6.0. Anadolu Üniversitesi Endüstri Mühendisliği Bölümü. Dosyalama İşlemleri. Ders Notları

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

LİNUX. Dosyalar ve dizinler

Programlama Dilleri 1. Ders 12: Belirleyiciler ve Niteleyiciler

Metin Dosyaları. Metin Dosyaları Dosya Açma ve Kapama Dosya Okuma ve Yazma Rastgele Erişim Standart Girdi/Çıktı Hata Kontrolü

mod ile açılacak olan dosyanın ne amaçla açılacağı belirlenir. Bunlar:

PROGRAMLAMAYA GİRİŞ DERS 2

Sınav tarihi : Süre : 60 dak.

Dizgiler. C dilinde karakter m şeklinde tek tırnak içerisinde yazılan ifadelerdir. Bu karakterlerin her biri aslında bir tamsayı ile ifade edilir.

Bilgilerin Uzun Vadeli Saklanması

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

HSancak Nesne Tabanlı Programlama I Ders Notları

Pointer Kavramı. Veri Yapıları

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

Eln 1001 Bilgisayar Programlama I

BLG 312 Bilgisayar İşletim Sistemleri 2006 BLG 312. Bilgilerin Uzun Vadeli Saklanması. Dosya Sistemi Görevleri. Dosya Sistemi Özellikleri

Yrd. Doç. Dr. Caner ÖZCAN

İşletim Sistemleri. Dr. Binnur Kurt Omega Eğitim ve Danışmanlık İşletim Sistemleri

Temel Giriş/Çıkış Fonksiyonları

Yrd. Doç. Dr. Caner ÖZCAN

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-8 Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

C nin Stantart Dosya Fonksiyonlarının Uyguladığı Tamponlama Mekanizması

BASİT C PROGRAMLARI Öğr.Gör.Dr. Mahmut YALÇIN

Mifare Kart Yazıcı/Okuyucu Modül (MFM-200)

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

ALGORİTMA VE PROGRAMLAMA II

UNIX/Linux Sistemlerinde Boru Haberleşmeleri

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

GENEL GĐRĐŞ-ÇIKIŞ FONKSĐYONLARI. ENF102 Jeoloji 1. #include <stdio.h> printf Fonksiyonu ÖRNEK. printf

Linux işletim sistemlerinde dosya hiyerarşisinde en üstte bulunan dizindir. Diğer bütün dizinler kök dizinin altında bulunur.

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

UNIX/Linux Sistemlerinde exec İşlemleri

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

k ise bir gerçek sayı olsun. Buna göre aşağıdaki işlemler Matlab da yapılabilir.

1 PROGRAMLAMAYA GİRİŞ

8. İŞARETCİLER (POINTERS)

Kocaeli Üniversitesi C Bilgisayar Programlama Ara Sınavı Test Soruları

Unix/Linux Sistem Programlama Ders Notları

Göstericiler (Pointers)

Yrd. Doç. Dr. Caner ÖZCAN

Gereksiz Kodlar. burada if deyiminin else bölümüne gerek var mı? İfade doğruysa zaten fonksiyon geri dönüyor. Bu aşağıdakiyle tamamen eşdeğerdir:

Unix/Linux Sistem Programlama Ders Notları

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

Linux altında komut satırında...

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

Girdi Çıktı İşlemleri

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

ALGORİTMA VE PROGRAMLAMA I DERS NOTU#10

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

ENF102 TEMEL BİLGİSAYAR BİLİMLERİ VE C/ C++ PROGRAMLAMA DİLİ. Gazi Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

Pascalda oluşturulacak dosyalar değişkenler gibi programın başında tanımlanır.

C Programlama printf() Fonksiyonu

Diziler (Arrays) Çok Boyutlu Diziler

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

PROGRAMLAMA. Dosyalama İşlemleri. Yrd. Doç. Dr. Bülent Çobanoğlu. Sakarya Üniversitesi Mekatronik Mühendisliği. Yrd.Doç.Dr.

Fonksiyonlar (Altprogram)

sayi=3 harf=a reelsayi=8.72 Bellek durumu 5. İşaretç iler (pointers)

Linux ta komutlar hakkında yardım almak için aşağıdaki komutlar kullanılır : - man - info - whatis - apropos

Hafta 12 Karakter Tutan Diziler

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

İşletim Sistemi. BTEP205 - İşletim Sistemleri

Dosya/Dizin İzinleri. Okuma (r) Yazma (w) Çalıştırma (x) Dosya içeriğini görebilir mi? (Klasörler için) dosya listesini alabilir mi?

NESNEYE YÖNELİK PROGRAMLAMA

Veri Yapıları. Amaçlar: Temel Veri Yapılarını Tanımlamalı Veri Yapılarını Veri Modeli ve Türlerini Öğreneceksiniz. İçindekiler:

C Programlama Dilinde Değişkenler

ELN1001 BİLGİSAYAR PROGRAMLAMA I

$ echo $PATH /sbin:/bin:/usr/sbin:/usr/bin:/usr/x11r6/bin: /usr/local/sbin:/usr/local/bin:/usr/games:.

BTEP243 Ders 3. class Yazım Kuralı:

İnternet Programcılığı Öğr. Gör. Serkan AKSU PHP de Dizi-Değişkenler, Nesneler. Dizi Oluşturma. Tek Boyutlu Diziler

BİL1001 Bilgisayar Bilimlerine Giriş 1

C Dosyalama. Öğr. Gör. M. Ozan AKI. Rev 1.0

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Transkript:

UNIX Türevi Sistemlerde Temel Dosya Fonksiyonları: open, close, read, write ve lseek Kaan Aslan 12 Temuz 2008 Dosya sözcüğünü çok sık kullanırız. Fakat bu sözcüğü tanımlayabilmek o kadar kolay değildir. Sahi nedir dosya? Dosyalar ikincil belleklerde tanımlanmış olan alanlardır. Bir dosyanın ismi ve erişim hakları gibi çeşitli özellikleri vardır. Dosyalara isimleriyle erişiriz. Erişim hakları o dosya üzerinde hangi işlemleri yapabileceğimizi belirtir. Dosyaların ikincil belleklerde nasıl tutulacağına ve onlara nasıl erişileceğine ilişkin belirlemeler tamamen işletim sistemi tarafından yapılmaktadır. Bir dosya açıldığında işletim sistemi bellekte oluşturduğu veri yapıları sayesinde dosyanın ikincil bellekteki fiziksel varlığıyla bağlantı kurar. Sunduğu çeşitli sistem fonksiyonlarıyla dosyadan bilgi okumayı, dosyaya bilgi yazmayı mümkün hale getirir. İşletim sistemlerinin dosya işlemleriyle ilgili bölümlerine kavramsal olarak dosya sistemi (file system) deniyor. Dosya sistemi işletim sistemlerinin gerçekleştirilmesi en zor alt sistemlerinden biridir. Bir işletim sisteminin performansı önemli ölçüde bu alt sisteme bağlıdır. İşletim sisteminin dosya sistemlerinin iki önemli görevi vardır. Bunlardan ilki ikincil belleklerdeki düzenlemeyi oluşturmaktır. Dosya parçalarının ikincil belleklerin neresinde ve nasıl tutulacağına yönelik birtakım belirlemelerin yapılmış olması gerekir. Örneğin bugün kullandığımız diskler sektör denilen parçalardan oluşuyor. Ardışıl sektör grupları ise disk blokları olarak numaralandırılıyor. Dosya sistemi hangi dosyaların hangi disk bloklarında tutulduğuna ilişkin düzenlemeleri yapmak zorundadır. İşletim sisteminin dosya sisteminin ikinci önemli görevi ise ikincil belleklerde belli bir düzene göre oluşturulmuş dosya bloklarını programcıya ardışıl byte topluluğu biçiminde sunmaktır. İşletim sistemi diskte çeşitli bloklara yayılmış bir biçimde bulunan dosyayı programcıya sanki ardışıl byte lardan oluşuyormuş gibi gösterir. Dosyadaki her byte ın -ilk byte sıfır olmak üzere- dosyanın kaçıncı byte ı olduğunu belirten bir offset değeri vardır. Programcı bilginin hangi disk bloklarında tutulduğuyla değil hangi offset te bulunduğuyla ilgilenir. Şüphesiz işletim sisteminin bütün bunları yapabilmesi için bellekte pek çok veri yapısını oluşturması ve bu veri yapılarına dayanarak çeşitli izlemeleri yapması gerekir. Programlama sırasında kendimizin ya da derleyicinin yaptığını sandığımız tüm dosya işlemleri aslında işletim sisteminin bir grup sistem fonksiyonu tarafından gerçekleştirilmektedir. Pek çok işletim sisteminde dosya açan, dosya kapatan, dosyadan okuma yapan, dosyaya yazma yapan, dosya göstericisini konumlandıran temel sistem fonksiyonları bulunur. Bu sistem fonksiyonları da çekirdek moduna geçerek bu işlemleri belli bir düzen içerisinde yürütür. İşletim sistemlerinin dosya sistemine ilişkin sistem fonksiyonları işletim sisteminden işletim sistemine, isim ve parametrik yapı bakımından farklılık göstermektedir. Örneğin Windows sistemlerinde dosyalar CreateFile isimli sistem fonksiyonu ile açılırken, UNIX/Linux sistemlerinde open sistem fonksiyonuyla açılmaktadır. Bu fonksiyonların parametrik yapıları 1

arasında önemli farklılıklar vardır. Her işletim sisteminin kendine özgü olanaklarını uç noktada kullanabilmek için bazen işletim sistemine özgü sistem fonksiyonlarından doğrudan faydalanma yoluna gidilebilir. UNIX türevi işletim sistemlerinin dosya sistemleri yapısal olarak birbirlerine çok benzer. Klasik Unix Sistem-V in dosya sistemine SVFS (System-V File System) deniliyordu. UNIX sistemlerinin dosya sistemleri zamanla çeşitli biçimlerde geliştirilmiştir. En önemli gelişme Berkley tarafından ilk kez BSD sistemlerinde kullanılmış olan FFS (Fast File System) tasarımıdır. Bugünkü UNIX sistemlerinin çoğu FFS türevlerini kullanmaktadır. Linux sistemlerinde bu dosya sistemine yeni ekler yapılmıştır. Linux un kullandığı bu sistemler Ext1, Ext2, Ext3 biçiminde isimlendirilmiştir. Tüm UNIX türevi sistemlerinin dosya sistemlerine ilişkin disk düzenlemesi birbirlerine benzer. Bu disk düzenleme sistemine kısaca i-node sistemi denilebilir. i- node sisteminde her dosyanın i-node numarası denilen ve dosya sistemi genelinde tek olan bir id numarası vardır. Dosyanın id numarası disk üzerinde onun yerinin belirlenmesinde önemli bir kullanıma sahiptir. UNIX türevi sistemlerin en önemli özelliklerinden biri sistemdeki aygıtlara, çeşitli çekirdek nesnelerine sanki onlar birer dosyaymış gibi dosya fonksiyonlarıyla erişilmesidir. Böylece çeşitli kavramların dosya kavramı içerisinde ifade edilmesi sistem programcısının işini kolaylaştırmaktadır. Örneğin tipik bir UNIX türevi sistemde borular (pipes) dosya değildir ama sanki birer dosyaymış gibi ele alınırlar. Dosyalar üzerinde işlem yapan read ve write fonksiyonları borularda da kullanılabilir. Aygıtların ve birtakım kavramların da sanki birer dosyaymış gibi ele alınması nesne yönelimli programlama tekniğindeki çokbiçimlilik (polymorphism) benzeri bir soyutlamaya olanak sağlamaktadır. Gerçekten de UNIX türevi sistemlerin kullandığı dosya sistemlerinin tasarım ve yazımında böyle çokbiçimli bir teknik kullanılmaktadır. Bu tekniğe Sanal Dosya Sistemi (Virtual File System) denir. UNIX/Linux sistemlerinde dosya sistemine ilişkin temel 5 POSIX fonksiyonu vardır. open fonksiyonu dosyayı açmak ya da yaratmak için, close fonksiyonu dosyayı kapatmak için, read fonksiyonu dosyadan okuma yapmak için, write fonksiyonu ise dosyaya yazma yapmak için kullanılır. lseek fonksiyonuyla da dosya göstericisi konumlandırılabilir. Bu fonksiyonların nasıl kullanıldığını bilmek önemlidir. Tabi önce dosya sistemine ilişkin temel güvenlik sistemi üzerinde duracağız Dosya Sistemine İlişkin Temel Güvenlik Sistemi Birden çok kişinin birlikte çalışabildiği sistemlerde her kullanıcının her istediği dosyaya erişememesi gerekir. Kullanıcıların hangi dosyalara hangi düzeyde erişebilecekleri yalın bir güvenlik sistemi ile belirlenmiştir. Her kullanıcının sisteme girdiğinde bir kullanıcı id si ve bir de grup id si aldığını biliyorsunuz. Kullanıcı ve grup id lerinin aslında birer sayı olduğunu fakat isimsel bir biçimde de temsil edildiğini anımsatalım. İşte dosyalara erişimde dosyaya erişecek prosesin (etkin) kullanıcı id si ve (etkin) grup id si etkili olmaktadır. [1] 2

UNIX/Linux sistemlerinde her dosyanın bir sahibi ve bir grubu vardır. Grup belli bir sayıda kullanıcının oluşturduğu topluluktur. Dosyanın sahibinin ve grubunun ne olduğu ls l komutu ile elde edilebilir. Örneğin: ls l test biçiminde bir komut uygulayrak test dosyasının bilgilerini aşağıdaki gibi elde etmiş olalım: -rw-r r 1 kaan project 1219 Jan 31 22:32 test Buradan dosyanın sahibinin kaan kullanıcısı olduğunu ve dosyanın project isminde bir gruba ilişkin olduğunu görülüyor. En soldaki sütun dosyanın türü ve erişim bilgileri hakkında bilgi vermektedir. Bu grubun en solundaki karakter dosyanın türünü belirtir. Örneğin dosya bir dizin dosyasıysa bu karakter d, soket dosyasıysa s ve bir boru (pipe) dosyası ise p biçimindedir. Bu karakterin biçiminde olması dosyanın normal bir dosya olduğu anlamına gelir. Diğer karakterler üçerliden üç grup oluşturmaktadır. İlk grup dosyanın sahibine (owner) ilişkin erişim haklarının neler olduğunu belirtir. İkinci grup dosyanın grubuyla (group) aynı gruptan olanların hangi haklara sahip olacağını belirtmektedir. Üçüncü grup ise ne dosyanın sahibi ne de dosya ile aynı gruptan olan birisinin, yani herhangi bir kişinin (other) haklarını belirtmektedir. Üçerli gruptaki karakterlerin birincisi ya r olur ya da biçiminde olur. r okuma hakkınının olduğunu ise okuma hakkının olmadığını göstermektedir. Üçlü gruptaki karakterlerin ikincisi ya w olur ya da olur. w dosyaya yazma hakkının olduğunu, ise olmadığını belirtir. Nihayet üçlü gruptaki son karakter ya x olur ya da olur. x bu dosya eğer çalıştırılabilir bir program dosyası ise dosyayı çalıştırma hakkının bulunduğunu belirtmektedir. ise dosyayı çalıştırma hakkının bulunmadığını belirtir. Yukarıdaki örnekte dosyanın sahiplik hakları rw- biçimindedir. O halde bu dosyanın sahibinin bu dosyadan okuma ve bu dosyaya yazma hakkı vardır. Dosya zaten çalıştırılabilir bir dosya olmadığı için dosyanın sahibinin dosyayı çalıştırması söz konusu değildir. Benzer biçimde dosyanın grubuyla aynı gruptan olan bir kişi dosyadan yalnızca okuma yapabilir. Dosya ile sahiplik ya da grup ilişkisi içerisinde olmayan sıradan kullanıcılar da dosyadan yalnızca okuma yapabilirler. Başka bir dosyanın bilgileri aşağıdaki biçimde olsun: -rw-rw-r-- 1 kaan project 1219 Jan 31 22:32 sample 3

Burada dosya yine sıradan bir dosyadır. Dosyanın sahiplik hakları rw- biçiminde olduğu için dosyanın sahibi dosyadan hem okuma yapabilir hem de dosyaya yazma yapabilir. Benzer biçimde dosyanın grup haklarının da rw- biçimde olduğunu görüyoruz. Yani dosyanın sahibi olmadığı halde onunla aynı gruptan olan birisi de dosya üzerinde okuma ve yazma işlemleri yapabilir. Fakat dosyanın sahibi olmayan ve dosya ile aynı gruptan da olmayan birisi ancak dosyadan okuma yapabilecektir. Dosyanın sahibi aynı zamanda herhangi bir kişi değildir. Yani dosyanın sahibi olan kişi dosyaya yazma yapamadığı halde herhangi birisi bu hakka sahip olabilir. Örneğin, dosyanın erişim haklarının aşağıdaki gibi olduğunu düşünelim: --r--rw-rw- kaan project 1219 Jan 31 22:32 sample Burada dosyanın sahiplik hakları r biçimindedir. Yani dosyanın sahibi yalnızca dosyadan okuma yapabilir. Oysa dosyanın sahibi olmayan birisi dosyanın sahibinden daha fazla haklara sahiptir. Tabi sıradan birisinin dosyanın sahibinden daha fazla haklara sahip olması çoğu kez anlamlı değildir. Burada anlatmak istediğimiz nokta dosyanın sahibinin yalnızca sahiplik hakları ile teste sokulduğudur. Benzer biçimde dosya ile aynı grupta bulunan birisi de yalnızca grup hakları ile test işlemine sokulacaktır. Dosya sistemine ilişkin güvenlik mekanizması dosyayı açan open sistem fonksiyonu tarafından denetlenir. Örneğin, yazma hakkına sahip olmadığımız bir dosyaya yazma yapmak isteyelim. Bu dosyaya yazma yapma gibi bir niyetimiz olduğuna göre dosyayı open sistem fonksiyonuyla yazma yapacak modda açmamız gerekir. İşte dosyayı daha open fonksiyonuyla açarken open fonksiyonu dosyanın erişim haklarına bakacak ve dosyayı açamayacaktır. Yani biz hatayı write fonksiyonu ile yazma yaparken değil, daha işin başında open fonksiyonuyla dosyayı açarken alacağız. Bir ya da birden çok sayıda kullanıcı bir grup oluşturabilir. Dosyanın sahibi dosyayı yaratan kişi, grubu ise dosyanın sahibinin ilişkin olduğu gruptur. (Bu konuda söyleyeceklerimiz var). Örneğin, kaan isimli kullanıcı project isimli grubun elemanı olsun ve bu kullanıcı a.dat isimli bir dosya yaratmış olsun. a.dat dosyasının sahibi kaan, grubu ise project olacaktır. UNIX sistemlerinde eskiden bir kullanıcı yalnızca bir gruba ilişkin olabiliyordu. Bu kavram daha sonra genişletilmiştir; bir kullanıcının tek bir gerçek grubu vardır, bunun dışında birden fazla ek gruba sahip olabilir. Dosyanın grubu onu yaratan kullanıcının gerçek grubuna ilişkindir. Daha önce de belirttiğimiz gibi, bir kullanıcının gerçek grubu /etc/passwd dosyasında, her grupta hangi kullanıcıların bulunduğu ise /etc/group dosyasında tutulmaktadır. Erişim İşleminin Adımları Bir dosyaya erişmek isteyen prosesin erişim denetimi sırasıyla şu adımlarla yapılır: 1. Eğer erişen prosesin etkin kullanıcı id si 0 ise (yani erişmek isteyen proses root ise) erişim kabul edilir. Değilse sonraki adıma geçilir. 2. Erişimi yapan prosesin etkin kullanıcı id si ile dosyanın kullanıcı id si aynı ise (yani proses kendisine ait bir dosyaya erişmek istiyorsa) erişimin biçimine bakılır. Erişim okuma amaçlıysa ve dosyanın sahiplik haklarında r varsa, erişim yazma amaçlıysa 4

ve dosyanın sahiplik haklarında w varsa ya da erişim hem okuma hem de yazma amaçlıysa ve dosyanın sahiplik haklarında rw varsa erişim kabul edilir. Eğer yapılan erişim bir programı çalıştırmaya yönelikse ve dosyanın sahiplik haklarında x varsa erişim kabul edilir. Değilse sonraki adıma geçilir 3. Erişimi yapan prosesin etkin grup id si dosyanın grup id si ile aynı ise ya da erişimi yapan prosesin ek grup id lerinden biri dosyanın grup id si ile aynıysa (yani proses kendi gruplarına ait bir dosyaya erişmek istiyorsa) erişimin biçimine bakılır. Erişim okuma amaçlıysa ve dosyanın grup haklarında r varsa, erişim yazma amaçlıysa ve dosyanın grup haklarında w varsa ya da erişim hem okuma hem de yazma amaçlıysa ve dosyanın grup haklarında rw varsa erişim kabul edilir. Eğer yapılan erişim bir programı çalıştırmaya yönelikse ve dosyanın erişim haklarında x varsa erişim kabul edilir. Değilse sonraki adıma geçilir. 4. Erişimi yapan proseses herhangi bir proses ise bu kez dosyanın diğerlerine ilişkin erişim haklarına bakılır. Erişim okuma amaçlıysa ve dosyanın diğer haklarında r varsa, erişim yazma amaçlıysa ve dosyanın diğer haklarında w varsa ya da erişim hem okuma hem de yazma amaçlıysa ve dosyanın diğer haklarında rw varsa erişim kabul edilir. Eğer yapılan erişim bir programı çalıştırmaya yönelikse ve dosyanın erişim haklarında x varsa erişim kabul edilir. Değilse erişim haklarının yetersizliği nedeniyle erişim engellenir. Yukarıda da belirttiğimiz gibi bu kontroller her dosya fonksiyonunda değil yalnızca open fonksiyonunda yapılmaktadır. Dosya Göstericisi Kavramı Dosyadaki tüm byte lara ilk byte sıfır olmak üzere artan sırada bir offset numarası karşılık getirilmiştir. Örneğin x.txt dosyasının içersinde Ankara yazısının karakterleri bulunuyor olsun. Yazı karakterlerinin ASCII tablosuyla birer byte olarak kodlandığını varsayalım. Dosyadaki karakterlerin offset numaraları şöyledir Dosya göstericisi kavramının C/C++ daki göstericilerle bir ilgisi yoktur. Dosya göstericisi o anda dosyanın hangi offset inden itibaren işlem yapılacağını belirten bir sayıdır. Dosya işlemleri yapan sistem fonksiyonları dosyanın neresine ilişkin işlem yapılacağını fonksiyonu çağırandan almazlar. Bu fonksiyonlar her zaman dosya göstericisinin belirttiği offset ten itibaren işlemlerini yaparlar. Örneğin biz read fonksiyonu ile dosyanın 100 üncü byte ından itibaren 10 byte okumak isteyelim. Bu fonksiyon bizden kaç byte okuma yapacağımızı ister fakat nereden itibaren 10 byte okunacağını istemez. İşlemini dosya göstericisinin gösterdiği yerden itibaren yapar. Bu durumda bizim fonksiyonu çağırmadan önce dosya göstericisini 100 üncü offset e konumlandırmamız gerekir. Dosya göstericisi dosya açıldığında 0 ıncı offset tedir: 5

Okuma ve yazma yapan sistem fonksiyonları dosya göstericisini okunan ya da yazılan miktar kadar otomatik ilerletmektedir. Örneğin biz bu dosyadan read fonksiyonu ile 2 byte okuyalım. A ve n karakterlerini okumuş oluruz. Bu işlemin sonucunda dosya göstericisi k karakterini gösteriyor duruma gelir: şimdi 4 byte daha okuyalım: Artık dosya göstericisi dosyanın sonuna gelmiştir. Dosya göstericisinin bu biçimde dosyada olmayan dosyanın son byte ından sonraki byte ı göstermesi durumuna EOF (End Of File) durumu denir. EOF durumundan okuma yapılamaz. Eğer okuma yapılmak istenirse okuma yapan fonksiyonlar başarısızlıkla geri döner. Ancak eğer dosya uygun bir biçime açılmışsa EOF durumunda dosyaya yazma yapılabilir. Bu durum dosyaya ekleme anlamına gelir. Yani dosyaya ekleme yapmak istiyorsak dosya göstericisini EOF durumuna çektikten sonra yazma yapmalıyız. open Fonksiyonu open fonksiyonu var olan dosyayı açmak ya da varolmayan bir dosyayı yaratıp açmak için kullanılan en temel fonksiyondur. Prototipi <fcntl.h> dosyası içerisindedir. int open(const char *pathname, int oflags,...); Gördüğünüz gibi fonksiyonun iki zorunlu parametresi vardır. Birinci parametre açılacak dosyanın yol ifadesini belirtir. Fonksiyonun ikinci parametresi dosya açış modunun belirlenmesinde kullanılır. Bu parametre O_ öneki ile başlayan çeşitli sembolik sabit biçimindeki bayrakların işlemi ile (bit veya operatörü) birleştirilmesinden oluşturulur. POSIX standartlarında O_XXX biçimindeki bu 6

sembolik sabitlerin sayısal değerleri hakkında birşey söylenmemiştir. Yani sayısal değerleri sistemden sisteme farkılık gösterebilir. Dosyaya erişim isteği (yani dosyanın okuma mı yoksa yazma amaçlı mı açılacağı) için üç bayrak kullanılır: O_RDONLY O_WRONLY O_RDWR Dosyayı açarken bu bayraklardan yalnızca biri kullanılmak zorundadır. Bir open çağırmasında bu bayraklardan hiçbirinin kullanılmamış olması ya da birden fazlasının kullanılmış olması hata oluşturur. Eğer dosyayı yalnızca okuma amaçlı açmak istiyorsak O_RDONLY bayrağını, yalnızca yazma amaçlı açmak istiyorsak O_WRONLY bayrağını, hem okuma hem de yazma amaçlı açmak istiyorsak O_RDWR bayrağını kullanmamız gerekir. [2] Açış modlarını belirten yukarıdaki üç bayrağa aşağıdaki bayraklar eklenebilir: O_CREAT: Bu bayrak dosya yoksa yarat anlamına gelir. Eğer dosya varsa bu bayrağın bir etkisi yoktur. Örneğin, a.dat isimli bir dosyayı O_RDWR O_CREAT bayraklarıyla yaratmaya çalışalım. Eğer a.dat dosyası varsa O_CREAT bayrağının bir etkisi olmaz. Fakat eğer a.dat dosyası yoksa önce bu dosya yaratılacak sonra da açılacaktır. Dosyanın yaratılması durumunda open fonksiyonuna üçüncü parametre girilmelidir. open fonksiyonunun bu üçüncü parametresi izleyen paragraflarda ele alınmaktadır. O_APPEND: Bu bayrak her türlü yazma işleminin dosyanın sonuna ekleme anlamına geleceğini belirtmektedir. Başka bir deyişle her türlü yazma işleminde önce dosya göstericisi sona çekilir, ondan sonra yazma yapılır. Örneğin O_RDWR O_APPEND belirlemesi ile dosyanın herhangi bir yerinden okuma yapılabilir, fakat tüm yazma işlemleri otomatik olarak dosyanın sonuna yapılır. O_RDONLY O_APPEND gibi bir belirleme hata oluşturmaz ancak buradaki O_APPEND bayrağının bir etkisi yoktur. O_EXCL: Bu bayrak ancak O_CREAT ile birlikte kullanılabilir. Tek başına kullanılamaz. O_CREAT O_EXCL dosya yoksa yarat fakat dosya varsa başarısızlıkla geri dön anlamına gelmektedir. Örneğin, a.dat isimli bir dosyayı O_CREAT O_EXCL bayraklarıyla yaratmaya çalışalım. Eğer a.dat dosyası yoksa önce bu dosya yaratılarak açılacaktır. Fakat a.dat dosyası varsa open fonksiyonu başarısızlıkla geri dönecektir O_TRUNC: Bu bayrak ancak O_WRONLY ya da O_RDWR bayraklarıyla kullanılabilir. Bu belirleme yazma amaçlı açılan dosyanın içeriğinin silineceği yani açılan dosyanın sıfırlanacağı anlamına gelir. Örneğin, a.dat isimli dosyayı O_RDWR O_TRUNC bayraklarıyla açmak isteyelim. Eğer dosya varsa açılarak içeriği sıfırlanacaktır. Dosya yoksa O_CREAT bayrağı kullanılmadığı için open fonksiyonu başarısız olacaktır. Aşağıdaki bayraklar ise seyrek kullanılırlar. Biz burada yalnızca temel açıklamalar yapacağız. 7

O_SYNC: Dosya eşzamanlı (senkron) işlemlere yönelik açılır. Bu durumda dosyaya yapılan yazmalarda disk-cache sistemi kullanılmaz. Yazma doğrudan fiziksel aygıta yapılır ve yazma yapan proses yazma bitene kadar bloke edilir. O_NOCTTY: Eğer açılan dosya bir terminal dosyasıysa söz konusu terminal prosesin kontrol terminali yapılmaz. O_NONBLOCK: Bu açış modu blokesiz işlemler yapmak için kullanılır. open fonksiyonunda kullanılan O_NONBLOCK, O_NOCTTY, O_SYNC gibi diğer bayrakların işlevleri ileride çeşitli konular içerisinde ele alınacaktır. Şimdi bu bayrak birleşimlerine ilişkin çeşitli örnekler üzerinde duralım: - Dosyayı O_RDONLY modu ile açmaya çalışalım. Bu durumda dosya eğer varsa ve dosyanın erişim hakları izin veriyorsa dosya açılır. Eğer dosya yoksa ya da erişim hakları izin vermiyorsa open fonksiyonu başarısız olur. - Dosyayı O_WRONLY O_CREAT moduyla açmaya çalışalım. Bu durumda dosya varsa ve erişim hakları izin veriyorsa dosya yazma modunda açılır. Dosya yoksa dosya yaratılırak yazma modunda açılır - Dosyayı O_RDWR O_CREAT O_EXCL modunda açmaya çalışalım. Dosya yoksa ve erişim hakları izin veriyorsa dosya yaratılır ve dosya hem yazma hem de okuma modunda açılır. Eğer dosya varsa açılmaz, open fonksiyonu başarısızlıkla geri döner. - Dosyayı O_RDWR O_CREAT O_TRUNC modunda açmaya çalışalım. Dosya varsa sıfırlanır ve açılır, dosya yoksa yaratılır ve açılır. Dosyadan okume ve dosyaya yazma yapılabilir. - Dosyayı O_WRONLY O_TRUNC modunda açmaya çalışalım. Dosya varsa sıfırlanır ve açılır, yoksa open fonksiyonu başarısızlıkla geri döner. open fonksiyonunun değişken sayıda parametre aldığını prototipinden anlamışsınızdır. Aslında open fonksiyonu ya iki parametre alır ya da üç parametre alır. Eğer dosyanın açış modu O_CREAT içeriyorsa dosyanın yaratılma olasılığı vardır. Bu durumda programcının kullanılma olasılığına karşı fonksiyonun üçüncü parametresini girmesi gerekir. Dosya açış modunda O_CREAT yoksa üçüncü parametreyi girmenin de bir anlamı yoktur. [3] open fonksiyonunun üçüncü parametresi dosyanın yaratılması durumunda dosyanın erişim haklarını belirlemekte kullanılır. Erişim hakları dosyanın sahibinin, grubunun ve diğerlerinin ne yapabileceğini belirler. Bu parametre aşağıdaki sembolik sabitlerin operatörü ile birleştirilmeleri ile elde edillir: S_IRUSR S_IWUSR S_IXUSR S_IRWXU S_IRGRP S_IWGRP Dosyanın sahibi için 'r' hakkı Dosyanın sahibi için 'w' hakkı Dosyayı sahibi için 'x' hakkı Dosyanın sahibi için 'r', 'w' ve 'x' hakları (S_IRUSR S_IWUSR S_IXUSR) Dosyanın grubu için 'r' hakkı Dosyanın grubu için 'w' hakkı 8

S_IXGRP S_IRWXG S_IROTH S_IWOTH S_IXOTH S_IRWXO Dosyayı grubu için 'x' hakkı Dosyanın grubu için 'r', 'w' ve 'x' hakları (S_IRGRP S_IGRP S_IXGRP) Diğerleri için 'r' hakkı Diğerleri için 'w' hakkı Diğerleri için 'x' hakkı Diğerleri için 'r', 'w' ve 'x' hakları (S_IROTH S_IOTH S_IXOTH) Sembolik sabitlerin hepsinin S_I öneki ile başladığna dikkat ediniz. Bundan sonra erişim hakkının nasıl olduğunu belirten R, W ya da X harfleri gelmektedir. Nihayet bu harfleri de erişimin kim için geçerli olduğunu anlatan USR, GRP ya da OTH kısaltmaları getirilmiştir. Grupların sonundaki makrolar o grubun tüm haklarının birleşimini belirtmektedir. open fonksiyonu başarı durumunda dosyayı temsil eden bir dosya betimleyicisine, başarısızlık durumunda -1 değerine geri döner. Dosya betimleyicisi açılmış bir dosyayı temsil eden int türden bir değerdir. Diğer dosya fonksiyonları bu betimleyici değeri parametre olarak isterler. open fonksiyonunun kullanılmayan en düşük dğerli dosya betimleyicisine geri döneceği standartlarda garanti altına alınmıştır. open fonksiyonu başarısızlık durumunda -1 değeri ile geri dönmeden önce errno değişkenine başarısızlığın nedenini anlatan değeri yükler. open fonksiyonunun başarısızlığına yol açabilecek tipi durumlar şunlardır: EACCESS : Dosyaya erişim hakları yetersizdir EEXIST : Dosya O_CREAT O_EXCL bayraklarıyla açılmaya çalışılmıştır ve dosya var olduğundan dolayı hata oluşmuştur. ENOENT : O_CREAT kullanılmadan dosya yaratılmaya çalışılmıştır. Fakat dosya yoktur. Ya da dosyaya ulaşmaya çalışan yol ifadesindeki dizinlerden biri bulunamamıştır.. EMFILE : OPEN_MAX sayısından daha fazla dosya açık durumdadır. Yani prosesin açabileceği en fazla dosya sayısı aşılmıştır. ENFILE : Sistem düzeyinde açılabilecek en fazla dosya sayısı aşılmıştır. EINVAL : open fonksiyonunun oflags parametresi yanlış birleşimlerle oluşturulmuştur.... :... Yukarıdaki tabloda tüm hata durumlarını listelemeyi uygun görmedik. Yalnızca en sık karşılaşılan hata durumlarını belirttik. Hata durumlarının tüm listesini POSIX standartlarından ya da UNIX/Linux man sayfalarından edinebilirsiniz. 9

Aşağıda open fonksiyonunun tipik bir kullanımını görüyorsunuz: int fd; /* dosya betimleyicisi */... if ((fd = open("test", O_RDWR)) == -1) { perror("open"); exit(exit_failure); } Başarısızlık durumunda hata nedeninin perror fonksiyonuyla yazdırılıp programının sonlandırıldığını görüyorsunuz. open fonksiyonunun yanı sıra creat isimli bir POSIX fonksiyonu da vardır: int creat(const char *path, mode_t mode); Fonksiyonun birinci parametresi dosyanın yol ifadesini ikinci parametresi erişim haklarını belirtir. Geri dönüş değeri yaratılan dosyaya ilişkin dosya betimleyicisidir. Aslında creat fonksiyonu open fonksiyonunun özel bir biçimidir. Yani: creat(path, mode); çağrıması ile, open(path, O_WRONLY O_CREAT O_TRUNC, mode); çağırması tamamen eşdeğerdir. creat fonksiyonu ilk UNIX sistemlerinden beri bulunmaktadır. Geçmişe doğru uyumu korumak için POSIX standartlarında da bulundurulmuştur. close Fonksiyonu Açılan her dosyayı işinizi bitirdikten sonra kapatmalısınız. Dosyayı kapatmak için close fonksiyonu kullanılmaktadır: int close(int fd); Fonksiyonun prototipi <unistd.h> dosyası içerisindedir. close fonksiyonu başarı durumunda 0 değerine başarısızlık durumunda 1 değerine geri döner ve errno değerini hatayı belirten bir değerle doldurur. Başarılı bir biçimde açılmış olan bir dosyanın kapatılamaması durumu karşılaşabileceğiniz normal bir durum değildir. Eğer close fonksiyonuna argüman olarak yanlış bir betimleyici geçmişseniz fonksiyon -1 ile geri döner ve errno değişkenini EBADF değerini yüklenir. close fonksiyonu sinyal dolayısıyla da başarısız olabilir. Aslında açtığımız dosyayı program sonuna kadar kullanacaksak program sonlanmadan önce kapatmak zorunda değiliz. Proses exit ya da _exit fonksiyonlarıyla sonlandırıldığında kapatılmamış olan dosyalar otomatik olarak kapatılmaktadır. 10

read ve write Fonksiyonları read fonksiyonu dosya göstericisinin gösterdiği yerden itibaren n byte okumak için write fonksiyonu da n byte yazmak için kullanılır. Fonksiyonların prototipleri <unistd.h> içerisindedir: ssize_t read(int fd, void *buf, size_t nbyte); ssize_t write(int fd, const void *buf, size_t nbyte); Fonksiyonların birinci parametreleri okuma ya da yazma işleminin yapılcağı dosyaya ilişkin dosya betimleyicilerini, ikinci parametreleri bellekteki aktarım adreslerini ve üüncü parametreleri de aktarılacak byte sayısını belirtir. İkinci parametreyle belirtilen adres read fonksiyonu için dosyadan okunacak bilginin yerleştirileceği yerin adresi, write fonksiyonu için ise dosyaya yazılacak bilgilerin bulunduğu yerin adresidir. Okunacak ya da yazılacak byte sayısının size_t ile temsil edildiğine dikkat ediniz. C standartlarını göre size_t derleyiciler tarafından işaretsiz tamsayı türlerinden birine typedef edilen bir tür olmak zorundadır. C derleyicilerin çoğuna size_t türü unsigned int olarak typedef edilmiştir. read ve write fonksiyonları okuyabildikleri ya da yazabildikleri byte sayısı kadar dosya göstericisini ilerletirler. read fonksiyonu başarı durumunda okunan byte sayısına başarısızlık durumunda 1 değerine geri döner. Dosyanın sonuna yaklaştığınız durumda kalan byte sayısından daha fazla okuma yapmak isterseniz, istediğiniz kadar değil kalan miktar kadar okuma yapabilirsiniz. Örneğin dosya göstericisinin gösterdiği yerden dosya sonuna kadar 25 byte bilgi bulunuyor olsun: char buf[100]; ssize_t n;... n = read(fd, buf, 100); burada biz 100 byte okumak istediğimiz halde 25 byte okuyabileceğiz ve read fonksiyonu da 25 değerine geri dönecektir. read fonksiyonu dosyanın sonuna gelmekten dolayı hiçbir değer okuyamazsa 0 değerine geri döner. Yani dosyanın sonuna gelip gelmediğimizi read fonksiyonunun 0 döndürmesinden anlayabiliriz. read ve write fonksiyonlarının geri dönüş değerlerinin ssize_t türünden olduğunu görüyorsunuz. POSIX standartlarına göre bu tür işaretli bir tamsayı türü olarak <sys/types.h> dosyası içerisinde include edilmek zorundadır. ssize_t türü 32 bit sistemlerde genellikle int olarak 64 bit sistemlerde long int olarak typedef edilmiştir. [4] read fonksiyonunun geri dönüş değeri üç durumdan biri olabilir. Eğer fonksiyonun geri dönüş değeri sıfırdan büyükse geri dönüş değeri okunan byte miktarıdır. Yukarıda da belirttiğimiz gibi okuduğunuz miktar okumak istediğiniz miktardan düşük olabilir. Bu durumu bir hata olarak değerlendirmemelisiniz. İkinci durum fonksiyonun sıfır ile geri dönmesidir. Bu durumda dosya sonuna gelindiğinden dolayı hiç okuma yapılamamıştır. Nihayet read bir okuma hatası olduğunda -1 değerine geri döner. Peki read fonksiyonu neden başarısız olabilir? En önemli nedenlerden biri bize bağlı olmayan dosya sistemine ilişkin sorunlardır. Tabi böylesi sorunların çok ender görülebileceğini unutmayalım. read fonksiyonunun başarısız olmasına yol açan belli başlı durumlar şunlardır: 11

EBADF : Dosya betimleyicisi geçersiz ya da uygunsuzdur. EINTR : Bir sinyal oluştuğundan dolayı read fonksiyonu başarısız olmuştur. Bu durumda hiçbir okuma yapılmamıştır. EIO : Fiziksel nedenlerden kaynaklanan okuma ya da yazma hatası.... :... read ve write fonksiyonlarının erişim haklarının yetersizliği yüzünden başarısız olamayacağını belirtelim. Çünkü erişim kontrolü read ve write fonksiyonları tarafından değil dosya açılırken open fonksiyonu trafından değerlendirilmektedir. Ancak read ve write fonksiyonları açış modu uygunsuzluğu durumunda başarısız olabilir. Örneğin O_WRONLY moduyla açılmış olan bir dosyadan okuma yapmak istersek read fonksiyonu başarısız olur ve errno değişkeni EBADF değeri ile doldurulur. write fonksiyonu dosyaya yazılan byte sayısına geri döner. Bu sayının normal olarak yazılmak istenen byte sayısı ile aynı olması gerekir. Normal dosyalar için yazılmak istenen byte sayısı ile yazılan byte sayısının aynı olması beklenir. Çünkü normal dosyalara yazma işleminde dosya sonuna gelinmesi gibi bir durum söz konusu olmaz. Dosya göstericisi dosyanın sonundaysa yazılacak olan her şey dosyaya eklenir. Tabi write fonksiyonu yine başarısız olarak -1 değeri ile geri dönebilir. Başarısızlığın nedenini belirten errno değişkeninin alabileceği belli başlı değerler şunlardır: EBADF : Dosya betimleyicisi geçersizdir EINTR : Bir sinyal oluştuğundan dolayı write fonksiyonu başarısız olmuştur. Bu durumda hiçbir okuma yapılmamıştır. EIO : Fiziksel nedenlerden kaynaklanan okuma ya da yazma hatası.... :... write fonksiyonu da açış modunun uygun olmaması nedeniyle başarısız olabilir. Bu durumda errno değişkeni EBADF değeri ile doldurulur. read ve write fonksiyonlarının çalışma biçimini anlmanız için bir dosya kopyalama örneği vermek istiyoruz. 12

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #define BUF_SIZE 512 int main(int argc, char *argv[]) { int fdd, fds; char buf[buf_size]; ssize_t n; if (argc!= 3) { fprintf(stderr, "wrong number of arguments!"); exit(exit_failure); } if ((fds = open(argv[1], O_RDONLY)) < 0) { perror("open"); exit(exit_failure); } if ((fdd = open(argv[1], O_WRONLY O_CREAT O_EXCL,S_IRUSR S_IWUSR)) < 0) { perror("open"); exit(exit_failure); } while ((n = read(fds, buf, BUF_SIZE)) > 0) if ((n = write(fdd, buf, n)) < 0) { break; if (n < 0) { perror("read"); exit(exit_failure); } printf("ok...\n"); } return 0; Kaynak dosyanın O_RDONLY, hedef dosyanın ise O_WRONLY O_CREAT O_EXCL modunda açıldığına dikkat ediniz. Döngü içerisinde dosyadan BUF_SIZE kadar bilgi okunmaya çalışılmış, okunabilen miktar hedef dosyaya yazılmıştır. BUF_SIZE değerinin 512 olduğunu görüyorsunuz. Örneğin, 520 byte lık bir dosyayı kopyalamaya çalışalım. read önce 512 ile sonra 8 değeri ile geri dönecektir. Daha sonra read çağrıldığında dosya göstericisi dosyanın sonunda olduğu için read bu kez 0 değeri ile geri dönecek ve böylece döngüden çıkılacaktır. read ve write fonksiyonlarının özel aygıtlardaki kullanımı ve blokesiz modda çalışmasını bu makalede ele almayacağız. 13

lseek Fonksiyonu Dosyanın belli bir yerinden okuma ya da yazma yapmak için önce okuyacağımız ya da yazacağımız yere dosya göstericisini konumlandırmamız gerekir. Bu işlem prototipi <unistd.h> içerisinde bulunan lseek fonksiyonuyla yapılmaktadır: off_t lseek(int fildes, off_t offset, int whence); Fonksiyonun birinci parametresi konumlandırmanın yapılacağı dosyaya ilişkin dosya betimleyicisini, ikinci parametresi konumlandırılacak offset değerini belirtir. off_t içerisinde bildirilmiş bir türdür. POSIX standartlarına göre off_t türü işaretli bir tamsayı türü olarak typedef edilmek zorundadır. Örneğin 32 bit sistemlerde tipik olarak long int biçimindedir. Son parametre konumlandırma işleminin nereye göre yapılacağını belirtir. Bu parametre tıpkı fseek fonksiyonunda olduğu gibi SEEK_SET, SEEK_CUR ya da SEEK_END sembolik değerlerinden birini almak zorundadır. Bu sembolik sabitler dosyası içerisinde bildirilmişlerdir. SEEK_SET konumlandırmanın dosyanın başından itibaren yapılacağını belirtir. Bu durumda offset belirten ikinci parametre 0 ya da pozitif bir değerde olmalıdır. SEEK_CUR konumlandırma işleminin dosya göstericisinin gösterdiği yerden itibaren yapılacağını belirtir. Bu durumda offset belirten ikinci parametre 0, pozitif ya da negatif olabilir. Pozitif değer ileriye doğru, negatif değer geriye doğru konumlandırma anlamına gelir. SEEK_END ise konumlandırma işleminin dosyanın sonundan itibaren yapılacağı anlamına gelir. Bu durumda ikinci parametre sıfır ya da negatif olabilir. Sıfır EOF durumunu belirtmektedir. Örneğin:... lseek(fd, 0, SEEK_END); write(fd,...);... işlemi dosyanın sonuna ekleme yapmakta kullanılabilir. lseek fonksiyonu başarı durumunda dosya göstericisinin dosyanın başından itibaren yeni konumunu belirten değerle, başarısızlık durumunda ise -1 değeriyle geri döner. Başarısızlık durumunda errno değişkeninin aldığı tipik değerler şunlardır: EBADF : Dosya betimleyicisi geçersizdir EINVAL : Fonksiyonun üçüncü parametresi SEEK_SET, SEEK_CUR ya da SEEK_END değerlerinin dışında bir değer almıştır.... :... lseek fonksiyonun prototipi dosyasındadır. Dosya göstericisinin read ve write fonksiyonları tarafından yazılan ya da okunan byte sayısı kadar otomatik olarak ilerletildiğini bir kez daha anımsatalım. 14

[1] Aslında test işlemine gerçek kullanıcı id'si (real user id) ve gerçek grup id'si (real group id) değil etkin kullanıcı id'si (effective user id) ve etkin grup id'si (effective group id) girmektedir. Ancak biz bu makalede kapsamı genişletmemek için bu iki id arasındaki farklılığa değinmiyoruz. [2] O_RDONLY ile O_WRONLY bayraklarını O_RDONLY O_WRONLY biçiminde birleştirerek O_RDWR bayrağının elde edileceğinin bir garantisi yoktur. Erişim bayraklarından yalnızca birini kullanabileceğinizi bir kez daha anımsatmak istiyoruz. O_RDONLY O_WRONLY belirlemesi geçersiz kabul edilmektedir. Dosyayı hem okuma hem de yazma amaçlı açmak için O_RDWR bayrağının kullanılması gerekir. [3] C de ve C++ ta fonksiyon parametresi olarak... (ellipsis) kullanılırsa bu durum fonksiyonun istenildiği kadar parametre ile çağrılabileceği anlamına gelir. Böyle fonksiyonlara değişken sayıda parametre alan fonksiyonlar denilmektedir. Değişken sayıda parametre alan fonksiyonların en azından bir tane normal parametresi olması ve... belirlemesinin de son parametre değişkeninde kullanılması zorunludur. Değişken sayıda parametre alan fonksiyonların kuşkusuz en ünlüsü printf ve scanf fonksiyonlarıdır. printf fonksiyonunun prototipi size iyi bir fikir verecektir: int printf(const char *format,...); Fonksiyon en az bir parametreyle çağrılmak zorundadır. [4] read ve write fonksiyonlarının geri dönüş değerinin işaretli tamsayı türünden olmasının nedeni başarısızlığı ifade edebilmek içindir. 32 bit sistemlerin hemen hepsinde int türü ile long türünün her ikisi de 32 bit uzunluğundadır. 64 bit sistemlerde ise int türü 32 bitte tutulurken long türü 64 bite çekilmiştir. 32 bit sistemlerdeki read fonksiyonunun uzunluk parametresi ile geri dönüş değeri size uyumsuz gelebilir. Gerçekten fonksiyonun uzunluk parametresi 4294967295 e kadar değer alabildiği halde geri dönüş değeri 2147483647 kadar değer alabilir. Bu durumda 32 bit sistemlerde biz uzunluk parametresini 2147483647 değerinden daha yüksek vermemeliyiz. Yoksa fonksiyon okunan değeri geri dönüş değeri olarak yansıtamaz. Eskiden UNIX sistemlerinde fonksiyonun uzunluk parametresiyle geri dönüş değeri uyumlu olacak biçimde (her ikisi de int türden) alınırdı. Daha sonra bu tutum değiştirildi. 15