CodeBlanks Logo Icon CodeBlanks

Message queue

  • C kursu
  • İleri seviye
  • Ders 34/83
  • 5 dk

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);.

Başlangıç kodu

main.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>

// mesaj yapısını tanımla
// kuyruk kur ve fork ile çocuk alıcı olsun
// ebeveyn mesaj gönderip temizlesin

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#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;
}

Beklenen çıktı

merhaba mq

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 msgget(IPC_PRIVATE, flags) çağrısı ne üretir?

  • Eski kuyruk
  • Yeni ve benzersiz kuyruk Doğru cevap
  • Boş mesaj
  • Silinmiş kuyruk

Açıklama: IPC_PRIVATE her zaman yeni ve benzersiz bir kuyruk üretir.

2 Mesaj kuyruğu fonksiyonlarını eşle

Kavram Anlamı
msgget Kuyruk oluşturur
msgsnd Mesaj gönderir
msgrcv Mesaj alır
msgctl Kuyruğu siler

3 msgsnd çağrısı

Soru
msgsnd(msqid, &msg, sizeof(msg.mtext), ____);
Cevap
msgsnd(msqid, &msg, sizeof(msg.mtext), 0);

Açıklama: 0 bayrağı kuyruk dolana kadar beklemeyi söyler.

İleri seviye bölümündeki tüm dersler