File Locking, Setting and Clearing a Lock

Kategori: Parallel Programming , 20 Ekim 2019 , JanFranco


File locking sistemi, işletim sistemlerinde I/O işlemlerinin birbirlerini etkilemesini önler. Örneğin bir process bir dosyayı açtı ve o dosyayla işlem yapıyor. Başka bir process bu dosyaya erişti ve o da işlem yaptı. Aynı dosya üzerinde, iki ayrı process'in aynı anda işlem yapması istemediğimiz durumları meydana getirebilir. Genellikle locking sistemde okuma işlemleri birçok process tarafından yapılırken, yazma işlemleri tek bir process tarafından yapılır. Yani bir dosyayı bir process okuyorken başka bir process de okuyabilir. Ancak yazma işlemi sadece tek bir process tarafından izinlidir. Şimdi bir file lock oluşturalım:


#include <"fcntl.h">

struct flock fl;
int fd;

fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
fl.l_pid = getpid();

fd = open("filename", O_WRONLY);

fcntl(fd, F_SETLKW, &fl);
fcntl header dosyasında tanımlı bir struct olan flock'tan bir fl objesi ürettik. Struct'ı yakından tanıyalım:

l_type: Lock'un türünü belirtir. Burada WriteLock anlamına gelen F_WRLCK kullandık. Diğer kullanabileceğimiz türler: F_RDLCK, F_UNLCK

l_whence: Lock işlemine nereden başlayacağımızı belirtir. SEEK_SET diyerek dosyanın en başından itibaren dedik. Diğer türler: SEEK_CUR, SEEK_END

l_start: l_whence değerinin offsetini belirtir. Örneğin l_whence değerini SEEK_SET ayarladık ve l_start değeri 4 atadık. Demiş olduk ki dosyanın başından itibaren 4 byte ileri git. Oradan itibaren işleme başla.

l_len: Offsetten itibaren işlem yapacağımız miktar. 0 diyerek EOF (End of File)'a kadar işlemi yap dedik.

l_pid: Process id'sini belirtir. getpid() fonksiyonu ile hesaplanır.

Struct'tan obje ürettik. Daha sonra dosya açma işlemi için open() fonksiyonunu kullandık. Son olarak fcntl() fonksiyonu ile lock'u tamamlamış olduk. fcntl fonksiyonu() argüman olarak dosya açma işleminde kullandığımız open() fonksiyonundan dönen değeri alır. İkinci argüman olarak LOCK işlemini alır. Üçüncü argüman olarak ise tanımlamış olduğumuz struct objesini alır. Lock işlemlerine bakalım:

F_SETLKW: Lock oluşturur. Eğer lock oluşturamazsa (daha önce başka bir process lock oluşturmuşsa vs.) beklemeye başlar. Lock kalkınca lock oluşturur.

F_SETLK: Lock oluşturur. F_SETLKW işleminin aksine eğer lock oluşturamaza, beklemek yerine -1 return eder.

F_GETLK: Bir dosyada lock olup olmadığını kontrol eder. Eğer lock var ise bu lock'un bilgilerini return eder.

Lock set etmeyi gördük. Şimdi de lock clear etmeyi görelim:


#include <"fcntl.h">

struct flock fl;
int fd;

fl.l_type = F_UNLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
fl.l_pid = getpid();

fd = open("filename", O_WRONLY);

fcntl(fd, F_SETLK, &fl);
Yukarıdaki kodda değişen tek şey l_type ve lock işlemidir. l_type kısmını F_UNLCK yani lock kaldırma olarak ayarladık. Lock işlemini de F_SETLKW yerine F_SETLK yaptık. Eğer F_SETLKW yapsaydık, dosyada lock mevcut ise kaldırmayacaktı ve kalkmasını bekleyecekti.


Sonraki Yazı: File Locking Exercise
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın