Yanıtlar:
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:
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 ipcs
veya 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