|
|
Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano Deutsch Francais Nederlands Russian Turkce |
taraf�ndan Leonardo Giordani <leo.giordani(at)libero.it> Yazar hakk�nda: Milan Politechnico'da Telekoninikasyon M�hendisli�inde okuyor.Network yonetici si olarak �al���yor ve programlama (�zellikle Assembly ve C/C++) ile ilgileniyor.1999 'dan beri neredeyse sadece Linux/Unix ile �al���yor. T�rk�e'ye �eviri: �zcan G�ng�r <ozcangungor(at)netscape.net> ��erik: |
E�zamanl� Programlama - �leti Kuyruklar� (2)�zet: Bu makale dizisi, okuyuculara �oklui�lem kavram�n�n ve onun Linux alt�ndaki uygulamalar�n�n tan�t�m�n� hedefler.�oklui�lemin temelindeki teorik kavramlar�n tan�t�m�ndan ba�lay�p, basit ama etkili bir ileti�im protokol� i�eren bir i�lemler aras� ileti�im uygulamas� verece�iz.Bu makalenin anla��labilmesi i�in gerekli bilgiler �unlard�r:
Daha �nce bu konu hakk�nda yay�nlam�� makaleleri okumak iyi olabilir:
|
Daha �nce de s�yledi�imiz gibi, protokol, iki ki�inin ya da makinan�n konu�abilmesi i�in (farkl� olsalar bile) gerekli olan kurallar k�mesidir.�rne�in, �ngilizce'nin kullan�m� bir protokold�r. ��nk� bu dil, benim Hintli okuyucular�mla( yazd�klar�mla her zaman �ok ilgileniyorlar) anla�mam� sa�l�yor. Daha Linux ile ilgili bir �rnek vermek gerekirse, e�er kernelinizi yeniden derlerseniz (korkmay�n, o kadar zor de�il), Network b�l�m� alt�nda, kernelinizin anlayabilece�i bir �ok protokol g�receksiniz.�rne�in, TCP/IP.
Bir protokol olu�turabilmemiz i�in �nce nas�l bir uygulama geli�tirece�imize karar vermeliyiz.Bu defa bir telefon anahtar�(switch) sim�lat�r� yazaca��z.Ana i�lem, telefon anahtar� olacak ve o�ul i�lemler, kullan�c� olarak hareket edecekler: Her kullan�c�ya, anahtar arac�l���yla ileti g�ndermesine izin verece�iz.
Protokol �� durumun �stesinden gelecek: kullan�c�n�n do�umu(�rne�in, kullan�c� var ve ba�l�), kullan�c�n�n s�radan i�leri ve kullan�c�n �l�m�(kullan�c� art�k ba�l� de�il).�imdi bu durumlar hakk�nda konu�al�m:
Bir kullan�c�, kendi ileti kuyru�unu olu�turdu�u sisteme ba�land���nda (unutmay�n, i�lemler hakk�nda konu�uyoruz), anahtar�n, kullan�c�ya nas�l ula�aca��n� bilebilmesi i�in, kullan�c�, kimli�ini anahtara g�ndermelidir. Burada, gereksinim duydu�unda, baz� yap�lar� ve verileri ba�latmas� i�in gerekli zaman� vard�r.Anahtardan, anahtar arac�l��� ile di�er kullan�c�lara g�nderilecek olan iletiyi yazaca�� kuyru�un kimli�ini al�r.
Kullan�c� iletileri g�nderebilir ve alabilir. Bir kullan�c�n� di�er kullan�c�ya bir ileti g�ndermesi halinde �u iki durum olu�ur: al�c� ba�l�d�r veya de�ildir. Her iki durumda da g�nderene bir bilgi g�nderilmesi gerekti�ine karar veririz. B�ylece iletisine ne oldu�unu bilir. Bunu, al�c� de�il, anahtar yapar.
Bir kullan�c� anahtarla ba�lant�s�n� kesti�inde, anahtar� haberdar etmelidir ve ba�ka bir�eye gerek yoktur. Bu t�r bir �al��may� tan�mlayan kod a�a��dad�r:
/* Birth - Do�um */ create_queue /* kuyruk_olu�tur */ init /* ba�lat */ send_alive /* ba�l�_g�nder */ send_queue_id /* kuyruk_kimlik_g�nder */ get_switch_queue_id /* anahtar_kuyruk_kimlik_al */ /* Work - �al��ma */ while(!leaving){ /* ayr�lm�yor ise */ receive_all /* hepsini_al */ if(<send_condition>){ /* durumu_g�nder ise */ send_message /* ileti_g�nder */ } if(<leave condition>){ /* durumu_b�rak */ leaving = 1 /* ayr�l�yor=1 */ } } /* Death - �l�m */ send_dead /* �l�_g�nder */
, telefon anahtar�n�n davran���n� tan�mlamal�y�z: Bir kullan�c� ba�land���nda, bize kendi ileti kuyru�unu kimli�ini i�eren bir ileti g�nderir. Biz bunu, bu kullan�c�ya g�nderilmi� iletileti ula�t�rmak i�in kaydetmeliyiz ve bu kullan�c�n�n di�er ula�t�rmam�z �zere g�nderdi�i iletilerin depolanaca�� ileti kuyru�unun kimli�ini g�ndererek cevap vermeliyiz. Sonra bu kullan�c�dan gelen b�t�n iletileri analiz edip g�nderilern kullan�c�lar�n sisteme ba�l� olup olmad���n� kontrol etmeliyiz.E�er kullan�c� ba�l� ise iletiyi g�ndeririz, de�ilse iletiyi sileriz.Her iki durumda da kullan�c�y� bilgilendiririz.Bir kullan�c� �ld���nde, sadece onun ileti kuyru�unun kimli�ini sileriz ve kullanucu ula��lamaz olur.
, kod uygulamas� ��yle olur:
while(1){ /* Yeni kullan�c� */ if (<birth of a user>){ /* bir kullan�c�n�n do�umu */ get_queue_id /* kuyruk_kimlik_al */ send switch_queue_id /* g�nder_anahtar_kuyruk_kimlik */ } /* Kullan�c� �l�r */ if (<death of a user>){ /* kullan�c�n�n �l�m� */ remove_user /* kullan�c�_sil */ } /* �leti ula�t�rmas� */ check_message /* ileti_kotrol� */ if (<user alive>){ /* kullan�c�_ba�l� */ send_message /* ileti g�nder */ ack_sender_ok /* g�nderen_tamam_g�nder */ } else{ ack_sender_error /* g�nderen_hata_g�nder */ } }
Yapaca��m�z ilk i�, msgbuf'�n kernel prototipini kullanarak iletiler i�in kendi yap�m�z� olu�turmal�y�z
typedef struct { int service; int sender; int receiver; int data; } messg_t; typedef struct { long mtype; /* �leti tipi */ messg_t messaggio; } mymsgbuf_t;
Bu iletide daha da geni�letece�imiz genel bir�eydir: G�nderen ve alan kullan�c� alanlar�, bir kullan�c� kim�ini i�erir ve veri alan�, genel veriler i�erir. Servis alan� ise anahtara bir servis iste�i i�in kullan�l�r. �rne�in, iki servisimizin oldu�unu d���nebiliriz: biri hemen, di�eri gecikmeli ula�t�rma.Bu durumda veri alan�, gecikme s�resini iletir. Bu sadece bir �rnektir ama servis alan�n bize ne gibi olas�l�klar sundu�unu anlamam�z� sa�lar.
�imdi, yap�m�z� yonetecek olan baz� fonksiyonlar� uygulayabiliriz, �zellikle ileti alan�n� alan ve dolduran fonksiyonlar�.Bu fonksiyonlar az �ok ayn�d�r. Bu y�zden sadece iki tanesini verece�im ve di�erlerini .h dosyalar�nda bulabilirsiniz.
void set_sender(mymsgbuf_t * buf, int sender) { buf->message.sender = sender; } int get_sender(mymsgbuf_t * buf) { return(buf->message.sender); }
Bu fonksiyonlar�n amac�, kodu k�saltmak de�il(sadece bir sat�rdan olu�uyor): Basitce anlamlar�n� hat�rlamak ve protokol�n insan diline daha yak� olmas�m� sa�lamak, b�ylece kullan�m�n� kolayla�t�rmak.
�imdi, IPC anahtarlar�n� �retecek, ileti kuyruklar�n� olu�turacek ve silecek, ileti g�nderecek ve alacak fonksiyonlar� yazmal�y�z: Bir IPC anaktar� olu�turmak kolayd�r:
key_t build_key(char c) { key_t key; key = ftok(".", c); return(key); }
Bir kuyruk olu�turacak fonksiyon:
int create_queue(key_t key) { int qid; if((qid = msgget(key, IPC_CREAT | 0660)) == -1){ perror("msgget"); exit(1); } return(qid); }
g�rd���n�z gibi, hata ile ba�a ��kma, bu durumda, kolyad�r.A�a��daki ,fonksiyon bir kuyruk siler:
int remove_queue(int qid) { if(msgctl(qid, IPC_RMID, 0) == -1) { perror("msgctl"); exit(1); } return(0); }
Son fonksiyon ileti alan ve g�ndern fonksiyondur: bir ileti �ndermek, onu belirli bir kuyur�a yazmakt�r, �rne�in, bize ahantar taraf�ndan veril olna kuyruk.
int send_message(int qid, mymsgbuf_t *qbuf) { int result, lenght; lenght = sizeof(mymsgbuf_t) - sizeof(long); if ((result = msgsnd(qid, qbuf, lenght, 0)) == -1){ perror("msgsnd"); exit(1); } return(result); } int receive_message(int qid, long type, mymsgbuf_t *qbuf) { int result, length; length = sizeof(mymsgbuf_t) - sizeof(long); if((result = msgrcv(qid, (struct msgbuf *)qbuf, length, type, IPC_NOWAIT)) == -1){ if(errno == ENOMSG){ return(0); } else{ perror("msgrcv"); exit(1); } } return(result); }
Hepsi bu. Fonksiyonlar� layer1.h dosyas�nda bulabilirsiniz: Bunlar� kullanarak bir program yazmaya �al���n(�rne�in, ge�en makaledeki �rnek). Bir sonraki makalede, protokol�n Katman 2'si hakk�nda konu�aca��z ve uygulamas�n� yapaca��z.
Bana yorumlar�n�z�, d�zeltmeleri ve sorular�n� e-posta adresimden (leo.giordani(at)libero.it) ya da TalkBack sayfas�ndan g�nderebilirsiniz. L�tfen bana �ngilizce, Almanca veya �talyanca yaz�n.
|
G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Leonardo Giordani, FDL LinuxFocus.org |
�eviri bilgisi:
|
2003-05-08, generated by lfparser version 2.35