RE: [Linux-programlama] select

---------

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

From: Burak DEMIRKOL (burak.demirkol@isoft.com.tr)
Date: Fri 19 Nov 2004 - 12:23:49 EET


Çok güzel ve şık tabi asenkron soket gereken durumlarda olacaktır. Ben esasında daha çok win32 de kod yazdığım için ordan kalma bi thread kullanma alışkanlığı var. Bilmiyorum bu sistemlerde belkide kötü bi yöntemdir ama;

Sigalrm signal fonksiyonunu yazıp 30 sn ye alarm kurmak yerine
30 sn uyuyan ve uyanınca çalışmasına devam eden bi thread yarattım.

30 sn beklemeden manuel olarak kill ya da raise fonksiyonu ile signal göndermek yerine.
Çalışan thread den pipe a bişi yazarak diğer threadi uyandırma

Yöntemi ile yaptım.

Siz select ile beklemek yerine sigiohandler signalini işlemişsiniz o yüzden thread e gerek kalmamış ama sizin yöntem daha çok hoşuma gitti. Bi ara fırsat bulursam sizinki gibi değiştirebilirim. Verdiğiniz bilgiler için çok teşekkür ederim.

Burak DEMİRKOL

Yazılım Geliştirme Uzmanı - ISOFT

 

Mihribat Cad. Eryılmaz Plaza No:223 Kat 5

34810 Kavacık İstanbul - Türkiye

Tel +90 216 413 5000 Pbx

Fax +90 216 413 7377

e-mail burak.demirkol@isoft.com.tr

-----Original Message-----
From: linux-programlama-bounces@liste.linux.org.tr [mailto:linux-programlama-bounces@liste.linux.org.tr] On Behalf Of Serdar KÖYLÜ
Sent: Friday, November 19, 2004 12:03 PM
To: linux-programlama@liste.linux.org.tr
Subject: RE: [Linux-programlama] select

Selamlar..

Mesele asenkron çalışmanın zevkidir. Ama elbette burada elinde çekiç
olan adamı oynamakta gayet mümkündür.

int error_stat=0;

void sigiohandler(int sig) {
   if (read_from_socket())
        error_stat = errno_hede;
}

void sigalrmhandler(int sig) {
   if (!error_stat) {
      printf("30 Saniye geçti gitti\n");
   }
   setitimer(...);
   error_stat = 0;
}

int main(void) {
    ....
    ....
    signal(SIGIO, sigiohandler);
    signal(SIGALRM, sigalrmhandler);
    setitimer(...);
    fcntl(socket, FASYNC|HEDE|vs);
}

Umarim biraz anlaşılıyordur. setitimer() size hassas bir timer sunar. Bu
timer ile kendinize bir timed signal yollatabilirsiniz kolayca (!?).

Gene tekrar edeyim, belki, sizin uygulamanız bu tür işler için makul
olmayabilir. Ama ASYNC çalışmanın nimetlerini ve yöntemlerini fırsattan
istifade yazıvermenin dayanılmaz hafifliğide gözönünde tutulmalı..

Saygı ve sevgiler..

> Hımmm anladım çok güzel bi signal handler işleyip orada işlemlerimi yapabilirim ve selecte gerek yok anladım.
> Ama şimdi bende öle garip bir durum varki yine benim çözümüm orada geçerli gibi. Nasıl anlatsam ki şöle diyeyim mesela ;
> Bir hata durumda soketten size hata durumunu veren 3 byte lık bişi geliyor ama hata olmadığı durumda ise hiç bişi gelmiyor.
>
> Bu durumda eğer hata yok ise hiç bir zaman sizin yöntemde o signal fonksiyonlarınada gelmicek. Tamam gelmesin güzel ben işimi zaten yaparım. Ama gelirsede o zamana kadar yaptığım işlemler boşa gidecek yani beklememde lazım.
> Ben ise şöyle yapıyorum. Bu bekleme esnasında diğer thread'i devreye sokarak bi şekilde başarılı olduğunu anlayabiliyorum ve başarılı olunca tamam sen artık select ten çık ve devam et diyorum. Başarılı olduğu noktadan itibaren select ten çıkması benim işime geliyor. Tamamen asenkron olması değil. Ama bu esnada da 30 beklemesin istedim. Çünkü zaten başarılı olmuş çıksın devam etsin dedim.

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

_______________________________________________
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.