C
Message queue
msgget ve msgsnd ile mesaj kuyruğu öğrenirsin.
Message queue
Mesaj kuyruğu, süreçlerin tiplenmiş mesajları sırayla gönderip aldığı bir IPC yapısıdır. msgget(key, flags) ile oluşturulur; IPC_PRIVATE anahtarı yeni kuyruk üretir. Her mesajın bir long mtype alanı vardır; alıcı bunu süzgeç olarak kullanır.
Mesaj yapısı kullanıcı tanımlıdır: struct Msg { long mtype; char mtext[16]; }; gibi. msgsnd(msqid, &msg, sizeof(msg.mtext), 0) ile gönderilir, msgrcv(msqid, &msg, sizeof(msg.mtext), 1, 0) ile alınır. mtype = 1 hedefler; 0 ise her tür kabul edilir. msgctl(msqid, IPC_RMID, NULL) kuyruğu siler.
Mesaj yapısı ve akış
Mesaj yapısının ilk alanı her zaman long mtype olmalıdır; aksi halde msgsnd ve msgrcv beklenmedik davranır. mtext alanı isteğe bağlıdır; boyutunu fonksiyonlara açıkça geçmelisin.
fork ile çocuk alıcı, ebeveyn gönderici olabilir. Çocuk msgrcv ile bekler; bu bloklayıcı bir çağrıdır. Ebeveyn msgsnd yapınca çocuk uyanır, mesajı alır ve yazdırır. wait(NULL) ile ebeveyn çocuğu toplar, sonra msgctl(IPC_RMID) ile kuyruğu siler.
Uygulama Mesaj kuyruğu ile veri gönder
struct Msg { long mtype; char mtext[16]; }; yapısını tanımla. int msqid = msgget(IPC_PRIVATE, 0600 | IPC_CREAT); ile kuyruk kur. pid_t pid = fork(); ile çocuk oluştur. Çocukta struct Msg rmsg; msgrcv(msqid, &rmsg, sizeof(rmsg.mtext), 1, 0);, printf("%s\n", rmsg.mtext);, _exit(0);. Ebeveynde struct Msg msg; msg.mtype = 1; strncpy(msg.mtext, "merhaba mq", sizeof(msg.mtext) - 1);, msgsnd(msqid, &msg, sizeof(msg.mtext), 0);, wait(NULL);, msgctl(msqid, IPC_RMID, NULL);.
Örnek çözümü göster
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
struct Msg { long mtype; char mtext[16]; };
int main(void) {
int msqid = msgget(IPC_PRIVATE, 0600 | IPC_CREAT);
pid_t pid = fork();
if (pid == 0) {
struct Msg rmsg;
msgrcv(msqid, &rmsg, sizeof(rmsg.mtext), 1, 0);
printf("%s\n", rmsg.mtext);
_exit(0);
}
struct Msg msg;
msg.mtype = 1;
strncpy(msg.mtext, "merhaba mq", sizeof(msg.mtext) - 1);
msgsnd(msqid, &msg, sizeof(msg.mtext), 0);
wait(NULL);
msgctl(msqid, IPC_RMID, NULL);
return 0;
}
Kendini test et
-
msgget(IPC_PRIVATE, flags) çağrısı ne üretir?
- Eski kuyruk
- Yeni ve benzersiz kuyruk
- Boş mesaj
- Silinmiş kuyruk
Cevabı göster
Yeni ve benzersiz kuyruk — IPC_PRIVATE her zaman yeni ve benzersiz bir kuyruk üretir.
-
Mesaj kuyruğu fonksiyonlarını eşle
- msgget
- Kuyruk oluşturur
- msgsnd
- Mesaj gönderir
- msgrcv
- Mesaj alır
- msgctl
- Kuyruğu siler
-
msgsnd çağrısı
msgsnd(msqid, &msg, sizeof(msg.mtext), ____);
Cevabı göster
msgsnd(msqid, &msg, sizeof(msg.mtext), 0);
Sıradaki ders: Semaphore