Linux çekirdeğinde bir mesaj sırası nasıl uygulanır?


Yanıtlar:


41

Linux çekirdeği (2.6) iki mesaj kuyruğu uygular:
(uygulama, FIFO prensibine kesinlikle uymayan bağlantılı bir liste kullanılarak yapıldığı için, 'mesaj listeleri' yerine)

Sistem V IPC mesajları

Sistem V'den gelen mesaj sırası

Bir işlem msgsnd()mesaj göndermeye çağırabilir . Alıcı mesaj sırasının IPC tanımlayıcısını, mesajın boyutunu ve mesaj tipini ve metni içeren bir mesaj yapısını geçmesi gerekir.

Diğer taraftan, bir işlem çağrıştırır msgrcv()mesajı depolanır gereken mesaj kuyruğunda, boyut ve bir değer IPC tanımlayıcısını geçirerek, bir mesaj almayı t .

t sıraya dönen mesajı belirten, pozitif bir değer türünün ilk mesaj için eşit anlamına t döndürülür, negatif bir değer verir son mesaj yazmak için eşit t ve sıra sıfır döner ilk mesajı.

Bu işlevler / linux / msg.h dosyasında tanımlanmıştır ve ipc / msg.c

Bir iletinin boyutu (maks), toplam ileti sayısı (mni) ve sıradaki tüm iletilerin toplam boyutu (mnb) ile ilgili sınırlamalar vardır:

$ sysctl kernel.msg{max,mni,mnb}
kernel.msgmax = 8192
kernel.msgmni = 1655
kernel.msgmnb = 16384

Yukarıdaki çıktı bir Ubuntu 10.10 sisteminden alınmıştır, varsayılan değerler msg.h dosyasında tanımlanmıştır .

Daha inanılmaz eski System V mesaj kuyruğu işleri burada açıklanmıştır .

POSIX İleti Kuyruğu

POSIX standardı, System V IPC'nin mesaj sırasını temel alan ve bazı işlevler tarafından genişleten bir mesaj sırası mekanizması tanımlar:

  • Uygulamaya basit dosya tabanlı arayüz
  • Mesaj öncelikleri için destek
  • Eşzamansız bildirim desteği
  • Engelleme işlemleri için zaman aşımları

Bkz ipc / mqueue.c

Örnek

util-linux mesaj sıralarını analiz etmek ve değiştirmek için bazı programlar sunar ve POSIX spesifikasyonu bazı C örnekleri verir:

İle bir mesaj kuyruğu oluşturun ipcmk; genellikle bunu ftok()ve benzeri C işlevlerini çağırarak yaparsınız msgget():

$ ipcmk -Q

Aşağıdakileri kullanarak ipcsveya ile ne olduğunu görelim cat /proc/sysvipc/msg:

$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        0            0           

Şimdi kuyruğu bazı mesajlarla doldurun:

$ cat <<EOF >msg_send.c
#include <string.h>
#include <sys/msg.h> 

int main() {
  int msqid = 65536;
  struct message {
    long type;
    char text[20];
  } msg;

  msg.type = 1;
  strcpy(msg.text, "This is message 1");
  msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);
  strcpy(msg.text, "This is message 2");
  msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);

  return 0;
}
EOF

Yine, genellikle koddaki msqid kodunu kullanmazsınız.

$ gcc -o msg_send msg_send.c
$ ./msg_send
$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        40           2        

Mesajları alacak olan diğer taraf:

$ cat <<EOF >msg_recv.c
#include <stdio.h>
#include <sys/msg.h>

int main() {
  int msqid = 65536;
  struct message {
    long type;
    char text[20];
  } msg;
  long msgtyp = 0;

  msgrcv(msqid, (void *) &msg, sizeof(msg.text), msgtyp, MSG_NOERROR | IPC_NOWAIT);
  printf("%s \n", msg.text);

  return 0;
}
EOF

Ne olduğunu görün:

$ gcc -o msg_recv msg_recv.c
$ ./msg_recv
This is message 1
$ ./msg_recv
This is message 2
$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        0            0           

İki alındıktan sonra sıra tekrar boştur.

Daha sonra ( -Q) veya msqid ( -q) tuşunu belirterek çıkarın :

$ ipcrm -q 65536

Öyleyse, mesaj (tür ve metin) klonlanır / kopyalanır ve ardından bu kopya sistemin mesaj sırasına girer mi?
trusktr

çok güzel koymak. Bu harika açıklama için teşekkür ederim.
9102d82
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.