Jawaban:
Kernel Linux (2.6) mengimplementasikan dua antrian pesan:
(lebih tepatnya 'daftar pesan', karena implementasi dilakukan dengan menggunakan daftar tertaut yang tidak sepenuhnya mengikuti prinsip FIFO)
Pesan sistem V IPC
Antrian pesan dari Sistem V.
Suatu proses dapat meminta msgsnd()
untuk mengirim pesan. Ia harus melewati pengidentifikasi IPC dari antrian pesan penerima, ukuran pesan dan struktur pesan, termasuk jenis pesan dan teks.
Di sisi lain, suatu proses meminta msgrcv()
untuk menerima pesan, melewati pengidentifikasi IPC dari antrian pesan, di mana pesan harus disimpan, ukuran dan nilai t .
t menentukan pesan yang dikembalikan dari antrian, nilai positif berarti pesan pertama dengan jenisnya sama dengan t dikembalikan, nilai negatif mengembalikan pesan terakhir sama dengan tipe t dan nol mengembalikan pesan pertama antrian.
Fungsi-fungsi tersebut didefinisikan dalam include / linux / msg.h dan diimplementasikan dalam ipc / msg.c
Ada batasan pada ukuran pesan (maks), jumlah total pesan (mni) dan ukuran total semua pesan dalam antrian (mnb):
$ sysctl kernel.msg{max,mni,mnb}
kernel.msgmax = 8192
kernel.msgmni = 1655
kernel.msgmnb = 16384
Output di atas berasal dari sistem Ubuntu 10.10, standarnya didefinisikan dalam msg .
Hal antrian pesan System V yang lebih luar biasa dijelaskan di sini .
Antrian Pesan POSIX
Standar POSIX mendefinisikan mekanisme antrian pesan berdasarkan antrian pesan System V IPC, memperluasnya dengan beberapa fungsi:
Lihat ipc / mqueue.c
Contoh
util-linux
menyediakan beberapa program untuk menganalisis dan memodifikasi antrian pesan dan spesifikasi POSIX memberikan beberapa contoh C:
Buat antrian pesan dengan ipcmk
; umumnya Anda akan melakukan ini dengan memanggil fungsi C seperti ftok()
dan msgget()
:
$ ipcmk -Q
Mari kita lihat apa yang terjadi dengan menggunakan ipcs
atau dengan cat /proc/sysvipc/msg
:
$ ipcs -q
------ Message Queues --------
key msqid owner perms used-bytes messages
0x33ec1686 65536 user 644 0 0
Sekarang isi antrian dengan beberapa pesan:
$ 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
Sekali lagi, Anda biasanya tidak membuat kode msqid dalam kode.
$ 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
Dan sisi lain, yang akan menerima pesan:
$ 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
Lihat apa yang terjadi:
$ 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
Setelah dua menerima, antrian kosong lagi.
Hapus setelahnya dengan menentukan kunci ( -Q
) atau msqid ( -q
):
$ ipcrm -q 65536