File Locking Exercise

Kategori: Parallel Programming , 20 Ekim 2019 , JanFranco


Konsoldan argümansız çağırıldığında ReadLock, bir argüman ile çağırıldığında WriteLock oluşturan bir program yazalım:


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
	                /* l_type   l_whence  l_start  l_len  l_pid   */
	struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
	int fd;

	(void)argv; // silence unused warning

	fl.l_pid = getpid();

	if (argc > 1) 
		fl.l_type = F_RDLCK;

	if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
		perror("open");
		exit(1);
	}

	printf("Press <RETURN> to try to get lock: ");
	getchar();
	printf("Trying to get lock...");

	if (fcntl(fd, F_SETLKW, &fl) == -1) {
		perror("fcntl");
		exit(1);
	}

	printf("got lock\n");
	printf("Press <RETURN> to release lock: ");
	getchar();

	fl.l_type = F_UNLCK;  /* set to unlock same region */

	if (fcntl(fd, F_SETLK, &fl) == -1) {
		perror("fcntl");
		exit(1);
	}

	printf("Unlocked.\n");

	close(fd);

	return 0;
}
fl adında bir struct objesi tanımladık ve ayarlamalarını yaptık. Önceki yazımda bununla ilgili daha detaylı bilgiye ulaşabilirsiniz. Eğer argüman gönderilmez ise if (argc > 1) bloğu çalışmayacak ve l_type değişmeyecek. Daha sonra open() ile dosyaya erişmeye çalıştık. Eğer erişemezsek hata mesajı ekrana bastırdık. Eğer erişirsek kullanıcıdan bir tuşa basmasını istedik. Kullanıcı tuşa bastığında bir lock oluşturduk. Tekrar tuşa basmasını istedik. Tekrar bastığında ise l_type ayarını F_UNCLK yaptık ve bu sefer tekrar fcntl() fonksiyonunu kullanarak lock kaldırdık. Hata kontrolleri için if bloklarını da kullandık ve dosyayı kapadıktan sonra programı sonlandırdık.


Sonraki Yazı: Message Queues
Yorumlar

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