Re: [Linux-programlama] message queues

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Emre Turkay (emre.turkay@vanderbilt.edu)
Date: Sat 04 Jun 2005 - 01:55:37 EEST


Merhabalar,

Benim gorebildigim birkac sorun;

Tufan BIYIKTAS wrote:

>
> msq_defs.h
> -------------
> #include <sys/types.h>
> #include <sys/ipc.h>
> #include <sys/msg.h>
> #include <string.h>
>
> #define SEED 'x'
> #define PATH "."
>
> #define BUFSIZE 4096
>
> typedef struct {
>
> long int msg_to; // kim gonderiyor
> long int msg_fm; // kime gonderiyor
> char buffer[BUFSIZE]; // gonderilen data
>
> }message_t;

Burada sorun yok, onemli olan message_t'nin ilk elemaninin bir "long"
olmasi ki bu data structure da belirtilen gerekliligi yerine getiriyor.
Onemli olan ilk long degiskenin linux (muhtemelen posix) kernel
acisindan ozel bir anlam ifade etmesi. Bu degisken queue'daki
message'lari etiketlemek icin kullaniliyor.

>
> const long int SERVER=1L; // server icin id
> const long int CLIENT=2L; // client icin id
>
>
> server.c
> --------
>
> #include "msq_defs.h"
>
> extern const long int SERVER;
> extern const long int CLIENT;
>
Burada bu iki degiskeni tanimlaniza gerek yok. Sonucta zaten header'i
include ederken bu degiskenlerin tanimlamalarini da derlenmis birime
(server.o) dahil ediyorsunuz. Hele hele extern olarak tanimlamanin hic
bir geregi yok. Ancak tanimlamanin bir sakincasi var mi emin degilim, en
guzeli hic kafa karistirmamak ve tanimlamamak.

> int main()
> {
> key_t key;
> int msq_id;
> message_t msg;
> int len = 2*sizeof(long int)+BUFSIZE*sizeof(char);

Bunun yerine sizeof(message_t) - sizeof(long) demeniz daha kolay ve
daha flexible olurdu (message struct'unu degistirmek istediginizde
burayi da degistirmek zorunda kalmazdiniz).

> // get message key key = ftok(PATH,SEED);

Burasi sanirim kopyalama hatasi.

> if(key == -1){
> printf("\nftok error !!!\n");
> exit(1);
> }

printf ve exit in tanimlandiklari stdio.h ve stdlib.h header'larini
include etmeniz gerekli. Aksi halde bir onceki ornekte gonderdiginiz
printf'in format stringinde bir integer'i print ederken %s kullanmak
gibi hatalar gozden kacabilir. Bu gibi sorunlara yakalanmamak icin en
guzeli compile warningleri sonuna kadar acip, derleyici mutlu olana
kadar kodu degistirmenin/duzeltmenin gerekli oldugu kanisindayim.
Ornegin gcc sizin kodunuz icin printf ve exit tanimli degil diyor, evet
hata degil ama uyari, derleyici uyarilarini dikkate almak guzel bir
aliskanlik.

>
> // creat a message queue
> if( (msq_id = msgget(key,IPC_CREAT | 0660)) < 0 )
> {
> printf("\nmsgget error !!!\n");
> exit(2);
> }
>
> //while(1){
> // buffer i temizle
> memset(msg.buffer,0x0,BUFSIZE);
> // queue dan CLIENT in yazdigini oku

Sanirim sorun burada mesaji queue'ya yazarken ilk alana
(message_t.msg_to) kismina kime gonderdiginizi yaziyor okurken ise kimin
gonderdigini okumaya calisiyorsunuz. Yani client ve server genelinde
kullandiginiz queue etiketi tutarli degil. Burada "CLIENT"i "SERVER"
olarak degistirirseniz bu mantik sorunu giderilmis olur.

Umarim yardimci olur,

emre

_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.