System V Interprocess Communication

Başlatan desperado, 20 Haziran 2014 - 00:16:37

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

desperado

        İyi akşamlar
            Stajımı yaptığım Sunny fabrikasında aldığım bir proje ile ilgili çeşitli sorularım var. Öncelikle umarım bu başlığı doğru yere açmışımdır zira forumu çok kurcaladım en uygun yerin burası olduğunu düşündüm.

           System V Interprocess Communication (IPC) platformunda paralel çalışan bir timer uygulaması yazmamı istendi. Bu uygulama timer set edildiğinde her saat vuruşunda bir process tetikleyerek pek çok işlemi aynı anda yapmaya çalışacak. (Kısacası 30 saniyeden geri sayım yaparken aygıt belirlenen saniyelerde mesela 15. saniyede bir process 10. saniyede ise bir başka process yaratacak ya da block edilen bir processi yeniden uyandıracak.)
           Ancak çok eski bir platform olduğundan bilmediğim ve günlerdir araştırdığım mekanizmaları bulunmakta.
              -Message Queue
              -Semaphores  (biraz aşinalığım olsa da sıkıntı çekiyorum.)
             -Shared Memory
          Asıl sorum şu  message queue yapısını kullanarak yarattığım bağımsız message queuelar arası basit mesajlar gönderip alıp görüntüleyebiliyorum ancak bir process'i bu queueler aracılığı ile nasıl tetikleyebilirim hiçbir fikrim yok. Semaphorelar ile  blocklayıp devam ettirebiliyorum ancak bir fonksiyon tetikleyemiyorum.


#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>

#define PERMISSION_MODE  0660 // izin modumuzu kullanıcının ve grubunun okuma ve yazabilmesi olarak ayarlıyorum.
#define MAX_MSG_LENGTH  128
.
.
.
/* Message Queue veri yapısı*/
struct benim_mesajim {
long mtype;
char mtext[MAX_MSG_LENGTH]
}msg;
struct msg *buf;
.  .  .  .
main(){ //Bazen (int argc char **argv) parametreleri de kullanmak durumunda oluyorum
    int msqid;
    char metin[MAX_MSG_LENGTH];
    if((msqid = msgget(IPC_CREAT, PERMISSION_MODE))<0){
        printf("mesaj yaratilamadi", errno);
        exit(-1);
}
     msg.mtype = 1; // gönderme ve almada gerekli bir parametre keyfi bir değer verdik.
     printf("mesaji giriniz: ");
     gets(metin);
     buf->mtype = type;
     strcpy(buf->mtext, metin);
     msgsnd(msqid, (struct benimmesajim *)buf, strlen(qbuf->mtext),PERMISSION_MODE);
     .  .  .  .  . 
     }
     /* Mesaj gönderme fonksiyonu bu şekilde yukarıdaki tek satır mesaj alma da neredeyse aynı parametrelerle işliyor
     ben bu şekilde metin yollayabiliyorum queuelar arası ancak processleri nasıl tetiklerim nasıl başlatırım bilmiyorum.

     
     Bir fikri olan varsa lütfen yazsın her türlü öneriye açığım yabancı kaynaklar örnekleme konusunda çok kıt bu konuda yerli kaynağın esamesi okunmuyor. Bir de yetişirse bunu ARM çekirdeğine göre derleyeceğim kütüphaneleri özelleştireceğim kısacası gerçekten yardıma ihtiyacım var herkese iyi akşamlar dilerim.
   
Uzun bir gece yolculuğu gibidir hayat uzunları yaksan da pek uzağı göremezsin.

sem

Semafor ile bir tetikleme yapmak mümkün mü bilemiyorum fakat anlamlı değil. Semaforlar ile bir kod bölümüne kaç tane thread'in aynı anda girebileceğini ayarlayabilirsiniz. Message Queue ise produce consumer problemi olarak görülebilir. Bir process'i yapılacak işleri sıraya sokan yani kuyruğa atan olarak düşünün, diğer processi de bu işleri yapan bir process olarak düşünün. Burada yapılacak iş ise bir process'i uyandırmak mesela sizin için.

MessageQueue'yu da örneğin shared memory'de saklayarak iki process arasında haberleşmeyi sağlayabilirsiniz ki shared memory de aslında bunun için kullanılır. Process'ler kendi belleklerinde çalışırlar ve bir process diğer bir process'te oluşturulan bir nesneye örneğin bir diziye erişemez. Fakat bu dizi shared memory de oluşturulursa her iki process de aynı diziye erişebilir duruma gelir.

Problemi net ve açık olarak bilemiyorum fakat ben sizin söylediklerinizden anladığım kadarı ile aşağdakine benzer bir şeyler yapardım sanırım:

* Bir Queue tanımlarda struct ile. Bu struct kendi içerisinde iki farklı structe/nesne/gereken herhangi bir şey barındırırdı.

   struct myQueueObject{
       struct objectDef;
       struct transaction;
   }
   gibi.

* Bir process ile shared memoryde tutulan bu yapıyı besler, objectDef yapısında işlem görecek process bilgileri, transaction'da ise bu process'e uygulanacak işlemi tanımlardım.
* Aynı shared memory'i kullanan farklı bir process ile de bu queue'yu okuyarak objectDef için istenen transaction işlemini yapardım.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?