[LinuxFocus-icon]
Ev  |  Eri�imd�zeni  |  ��indekiler  |  Arama

Duyumlar | Belgelikler | Ba�lant�lar | LF Nedir
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Leonardo]
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)

[run in paralell]

�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:

  • Minimum kabuk bilgisi
  • Temel C dili bilgisi (yaz�m, d�ng�ler, k�t�phaneler)
Komutlar�n kullan�m klavuzlar�(manual pages), komutun hemen yan�ndaki parantezler i�inde verilmi�tir. B�t�n glibc fonksiyonlar�, "info Libc" komutu ile belgelendirilmi�tir.

Daha �nce bu konu hakk�nda yay�nlam�� makaleleri okumak iyi olabilir:

 

Giri�

Bu dizideki son makalede, iki (ya da daha �ok) i�lemi nas�l e�zamanl� ve ileti kuyruklar�n� kullanarak nas�l birlikte �al��t�rabilece�imizi ��rendik.Bu makalede, daha ileri gidip, kendi ileti de�i�-toku�umuz i�in bir protokol olu�turmaya ba�layaca��z.

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 */
 }
}
 

Hatalarla Ba�a ��kma

Hata durumlar�yla ba�a ��kma, bu projedeki en �ncemli ve en zor b�l�md�r.Dahas�, Tam bir hata kontrol altistemi, yaz�lan kodun neredeyse %50'sidir. Bu makalede nas�l iyi bir hata kontrol rutini yaz�laca��n� a��klamayaca��m ��nk� bu konu �ok karma��kt�r ama bu andan itibaren hata durumlar�n� kontrol edece�im ve y�netece�im. Hata kontrol i�in iyi bir tan�t�m, glibc(www.gnu.org) kullan�m klavuzlar� ile gelmektedir ama -ilgilenirseniz- bunu ile ilgi bir makale yazace��m.  

Protokol Uygulamas� - Katman 1

k���k protokol�m�z, iki katmandan olu�maktad�r: �lki(d���k olan�), kuyuklar� y�neten, iletileri haz�rlayan ve g�nderen fonksiyonlardan olu�urken y�ksek katman, anahtar�n ve kullan�clar�n davran��lar�n� tan�mlayan kodlardaki(yukar�da verilen) fonksiyonlar gibi, protokol� uygular.

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.

 

�nerilen Kaynaklar

 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Leonardo Giordani, FDL
LinuxFocus.org
�eviri bilgisi:
en --> -- : Leonardo Giordani <leo.giordani(at)libero.it>
en --> tr: �zcan G�ng�r <ozcangungor(at)netscape.net>

2003-05-08, generated by lfparser version 2.35