Üye Kayıt Üye Giriş

Process’in Maskeleme Değeri


Process’in Maskeleme Değeri

 

open ve create fonksiyonlarında belirtilen erişim hakları process’in maskeleme değeri denilen
bir değer ile işleme sokularak gerçek erişim hakları belirlenir. Her process’in bir maskeleme
değeri vardır. Bir process başka bir process’i yarattığında bu değer yeni process’e aktarılır
(Yani örneğin shell üzerinden program çalıştırdığımızda çalıştırılacak process’in maskeleme
değeri shell’in maskeleme değeri olur). Process maskeleme değerini istediği zaman umask
sistem fonksiyonu ile değiştirebilir. Genellikle shell tarafından belirlenmiş default maskeleme
değeri 022 biçimindedir. Process’in maskeleme değerindeki 1 olan bitler dosyanın yaratılması
sırasında kesinlikle dikkate alınmayacak erişim özelliklerini belirtmektedir. Örneğin 022
(8’lik sistemde) maskeleme değeri şu anlama gelir:


0 2 2
000 010 010


Burada görüldüğü gibi grup ve diğer kişiler için yazma hakkı tamamen maskelenmiştir. Yani
biz bu maskeleme değeri ile dosyayı 666 erişim haklarıyla yaratmak istesek bile dosya wr-r--
r--haklarıyla yaratılacaktır. Bu işlemlerin daha algılanabilir karşılığı şöyledir:


<open fonksiyonunda belirtilen erişim bitleri> & ~<maskeleme değeri>
C ve Sistem Programcıları Derneği 31
Sonuçta elde edilen değerin 0 olan bitleri erişimin yasaklandığı 1 olan bitleri erişimin kabul
edildiği yerleridir. Örneğin:


022 = 000 010 010
~022 = 111 101 101
& 110 100 100
wr- r-- r--


umask Fonksiyonu
Process’in default maskeleme değerini değiştirmekte kullanılır.
mode_t umask(mode_t mask);


Fonksiyon process’in maskeleme değerini parametresiyle belirtilen değer olarak belirler ve
eski maskeleme değerini geri dönüş değeri olarak verir. Process’in maskeleme değerini alan
başka bir fonksiyon yoktur. Bu işlem şöyle yapılabilir:


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


close Fonksiyonu
Açılan her dosya kapatılmalıdır. Kapatılma işlemi bilinçli olarak yapılmaz ise sistem
tarafından process bittiğinde açık olan dosyalar kapatılır.
int close(int fd);
Fonksiyonun prototipi unistd.h başlık dosyası içerisindedir.
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
int fd;
umask(0);
fd = open("a.dat", O_RDWR | O_CREAT, 0666);
if (fd == -1) {
fprintf(stderr, "Cannot open file..\n");
exit(1);
}
close(fd);
}


read ve write Fonksiyonları

C ve Sistem Programcıları Derneği 32
POSIX dosya fonksiyonları çok azdır. Bütün yazma ve okuma işlemleri read ve write sistem
fonksiyonları ile yapılır.


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


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


Fonksiyonların birinci parametresi dosya betimleyicisi, ikinci parametresi transfer adresi ve
üçüncü parametresi transfer edilecek byte sayısıdır. Fonksiyonların geri dönüş değerleri
transfer edilen byte sayısıdır. Örnek bir kopyalama programı. Fonksiyonların prototipleri
unistd.h başlık dosyası içerisindedir.


UNIX/Linux ve DOS sistemlerinde aşağı seviyeli sektör temelinde kopyalama yapan sistem
fonksiyonları yoktur. Kopyalama işlemi iki dosyanın açılıp bilgilerin blok blok taşınması ile
yapılır. Blok büyüklüğü için sektör katları tercih edilmelidir.


#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define BLOCK_SIZE 1024
int main(int argc, char *argv[])
{
int fds, fdd;
char buf[BLOCK_SIZE];
int n;
if (argc != 3) {
fprintf(stderr, "Wrong number of arguments...!\n");
exit(1);
}
if ((fds = open(argv[1], O_RDONLY)) == -1) {
fprintf(stderr, "Cannot open source file : %s\n", argv[1]);
exit(1);
}
if ((fdd = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1) {
fprintf(stderr,"Cannot open destination file...!\n", argv[2]);
close(fds);
exit(1);
}
while (( n = read(fds, buf, BLOCK_SIZE)) > 0)
write(fdd, buf, n);
printf("1 File Copied...\n");
close(fds);
close(fdd);
return 0;
}


read ve write fonksiyonları başarısızlık durumunda –1 değerine geri dönerler. Bu durumda
başarısızlığın nedeni klasik olarak errno değişkeninden alınabilir. Ancak yukarıdaki
programda başarısızlık kontrolü yapılmamıştır. Yani okuma hatası olduğunda program
C ve Sistem Programcıları Derneği 33
döngüden çıkmaktadır. Bir dosya başarılı bir biçimde açıldıysa normal olarak read ve write
fonksiyonlarında hata oluşmaması gerekir. Hata ancak kritik bir biçimde ortaya çıkabilir.
Zaten bu tür durumlarda sistemin kendiside çoğu kez düzgün çalışmayacaktır. read ve write
fonksiyonlarının son parametreleri ve geri dönüş değerleri bazı UNIX/Linux sistemlerinde
unsigned biçimindedir. Ancak o sistemlerde de –1 değeri özeldir.


creat Fonksiyonu

Eskiden open fonksiyonunun yaratma özelliği yoktu, bu nedenle dosyayı ilk kez yaratmak
için creat fonksiyonu kullanılırdı.
int creat(const char *path, mode_t mode);
Bu fonksiyon eski programların hatırına hala varlığını sürdürmektedir. Eskiden open
fonksiyonu yalnızca var olan dosyaları açabiliyordu, yeni bir dosya yaratmak için bu
fonksiyonu kullanmak gerekirdi. Aşağıdaki iki çağırma tamamen birbirine eşdeğerdir.


creat(path, mode);
open(path, O_WRONLY | O_CREATE | O_TRUNC, mode);
POSIX sistemlerinde creat fonksiyonunun kullanılmasının bir gereği kalmamıştır.
open ve creat Fonksiyonlarının Boş Dosya Betimleyicilerinin Tespit Edilmesi
open ve creat fonksiyonları ile yeni bir dosya yaratıldığında dosya betimleyicisi olarak dosya
tablosundaki küçükten büyüğe doğru ilk boş slot elde edilir. Örneğin process’in dosya
tablosunun durumu şöyle olsun:
Şimdi open ya da creat fonksiyonu ile dosya yaratıldığında dosya betimleyicisi olarak
kesinlikle 4 elde edilecektir.


stdin, stdout ve stderr Dosyalarının Yaratılması
Dolu
Dolu
Dolu
Dolu
Boş
Dolu
0
1
2
3
4
5
Dosya
Tablosu
C ve Sistem Programcıları Derneği 34
Shell programının dosya tablosunda default olarak 3 dosya açılmış bir biçimde bulunur.
Bunlar 0 betimleyicisine ilişkin stdin (klavye), 1 betimleyicisine ilişkin stdout (ekran) ve 2
betimleyicisine ilişkin stderr’dir. Bütün programlar shell üzerinden çalıştırıldığına göre ve
dosya tablosu da çalıştırılan process’e aktarıldığına göre, yeni bir process oluşturulduğunda o
process’in de dosya tablosunun ilk üç slotunda bu dosyalar açılmış bir biçimde bulunacaktır.
Yeni yaratılmış bir process’in dosya tablosu şöyledir:


Örneğin:
write(1, “Kaan”, 4);
write fonksiyonu yukarıdaki örnekte nesne yönelimli ve çok biçimli bir biçimde process
tablosundan ve dosya tablosundan hareket ederek ekrana ilişkin gerçek write fonksiyonunu
çağırır ve bu da yazının ekrana çıkmasını sağlar. Kişinin hangi dosyaya yazacağı ve gerçekte
hangi fonksiyonun bu yazma işleminde kullanılacağı dosya nesnesinde belirlenmektedir. İki
dosya betimleyicisinin değerleri farklı olsa ama bunlar aynı dosya nesnesini gösterse aynı
dosya üzerinde işlem yapacaklardır. Dosya nesnesinde aynı zamanda dosya göstericisinin
aktif değeri de tutulmaktadır. Bu durumda farklı dosya betimleyicileri aynı dosya nesnesini
görüyorlarsa bunların dosya göstericisi de ortak olur. Örneğin fd1 ve fd2 farklı değerlere
ilişkin dosya betimleyicileri olsun, fakat aynı dosya nesnesini görsün. Aşağıdaki örnekte write
işlemiyle pos pozisyonuna yazma yapılır.


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


Dosya göstericisini konumlandırmakta kullanılan lseek fonksiyonu aslında herhangi bir giriş
çıkış işlemine yol açmamaktadır. Bu fonksiyon yalnızca dosya nesnesi içerisindeki aktif
stdin
stdout
stderr
Boş
Boş
Boş
0
1
2
3
4
5
Dosya
Tablosu
Klavye
Ekran
Dosya
Nesnesi
C ve Sistem Programcıları Derneği 35
pozisyon bilgisini değiştirmektedir. stdout ve stderr dosyalarının default olarak her ikisinin de
ekrana ilişkin olması bu biçimde kolaylıkla anlaşılabilir.
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
int fd;
close(1);
if ((fd = open("a.dat", O_RDWR|O_CREAT|O_TRUNC, 0666)) == -1) {
fprintf(stderr, "Cannot open file...!\n");
exit(1);
}
printf("Merhaba\n");
return 0;
}

Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER