C Academy · บทเรียน

คิวข้อความ

การส่งข้อความแบบมีโครงสร้าง

บทเรียน 3 จาก 413 ขั้นตอน

คิวข้อความ เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

การส่งข้อความแบบมีโครงสร้าง

คิวข้อความช่วยให้กระบวนการแลกเปลี่ยนข้อความที่แยกเป็นหน่วย แทนการใช้กระแสไบต์ดิบ เคอร์เนลจะรักษาขอบเขตของข้อความไว้ ดังนั้นการส่งแต่ละครั้งจึงกลายเป็นการรับหนึ่งครั้งพอดี

ข้อความเทียบกับกระแสข้อมูล

ไปป์ส่งกระแสไบต์ที่ขอบเขตของข้อมูลไม่ชัดเจน ส่วนคิวข้อความส่งข้อมูลเป็นหน่วยสมบูรณ์:

  • การเรียก send แต่ละครั้งคือหนึ่งข้อความ
  • การเรียก receive แต่ละครั้งคืนค่าหนึ่งข้อความ
  • ข้อความสามารถกำหนดลำดับความสำคัญได้

คิว POSIX เทียบกับ System V

มี API อยู่สองแบบ:

  • POSIX: mq_open, mq_send, mq_receive โดยตั้งชื่อด้วยเครื่องหมายทับ
  • System V: msgget, msgsnd, msgrcv ใช้คีย์และข้อความที่มีประเภท

POSIX เป็นตัวเลือกสมัยใหม่ที่สะอาดกว่า

การเปิดคิว

mq_open จะสร้างหรือเปิดคิวที่มีชื่อและคืนค่าตัวบอกไฟล์ คุณสามารถส่งแอตทริบิวต์ต่าง ๆ เช่น จำนวนข้อความสูงสุดและขนาดข้อความได้

#include <mqueue.h>
#include <fcntl.h>

mqd_t open_queue(const char *name) {
    return mq_open(name, O_CREAT | O_RDWR, 0644, NULL);
    /* name like "/myqueue"; NULL uses default attributes */
}

แอตทริบิวต์ของคิว

struct mq_attr กำหนด mq_maxmsg (ความจุ) และ mq_msgsize (จำนวนไบต์สูงสุดต่อข้อความ) บัฟเฟอร์ของตัวรับต้องมีขนาดอย่างน้อย mq_msgsize

#include <mqueue.h>

void set_attr(struct mq_attr *a) {
    a->mq_flags = 0;
    a->mq_maxmsg = 10;     /* up to 10 queued messages */
    a->mq_msgsize = 256;   /* each at most 256 bytes */
    a->mq_curmsgs = 0;
}

การส่งข้อความ

mq_send วางข้อความลงในคิวพร้อมลำดับความสำคัญ ข้อความที่มีลำดับความสำคัญสูงกว่าจะถูกส่งก่อน

#include <mqueue.h>
#include <string.h>

int post(mqd_t q, const char *text) {
    return mq_send(q, text, strlen(text) + 1, 5); /* priority 5 */
}

การรับข้อความ

mq_receive คืนค่าข้อความที่มีลำดับความสำคัญสูงสุด บัฟเฟอร์ต้องมีขนาดอย่างน้อย mq_msgsize มิฉะนั้นการเรียกจะล้มเหลวด้วย EMSGSIZE

#include <mqueue.h>
#include <stdio.h>

void get(mqd_t q, size_t msgsize) {
    char buf[256];
    unsigned prio;
    ssize_t n = mq_receive(q, buf, msgsize, &prio);
    if (n >= 0) printf("got (prio %u): %s\n", prio, buf);
}

ลำดับความสำคัญกำหนดลำดับการส่ง

ต่างจากไปป์ FIFO คิวข้อความจะส่งตามลำดับความสำคัญก่อน แล้วจึงเรียงตามลำดับการมาถึงภายในลำดับความสำคัญเดียวกัน ทำให้ข้อความเร่งด่วนแซงหน้าได้

แบบบล็อกกับแบบไม่บล็อก

โดยค่าเริ่มต้น mq_send จะบล็อกเมื่อคิวเต็ม และ mq_receive จะบล็อกเมื่อคิวว่าง ให้เปิดด้วย O_NONBLOCK เพื่อให้ทั้งสองฟังก์ชันคืนค่า EAGAIN แทนการรอ

การทำงานแบบกำหนดเวลา

mq_timedsend และ mq_timedreceive รับกำหนดเวลาสิ้นสุดแบบค่าสัมบูรณ์ และล้มเหลวด้วย ETIMEDOUT หากการทำงานไม่เสร็จภายในเวลาที่กำหนด วิธีนี้ช่วยป้องกันการรอตลอดไป

การล้างทรัพยากร

ปิดตัวบอกไฟล์ด้วย mq_close และนำคิวที่มีชื่อออกจากระบบด้วย mq_unlink เพื่อไม่ให้คิวยังคงอยู่หลังจากผู้ใช้ทั้งหมดใช้งานเสร็จแล้ว

#include <mqueue.h>

void cleanup(mqd_t q, const char *name) {
    mq_close(q);
    mq_unlink(name); /* remove the named queue */
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับคิวข้อความ

สรุปทบทวน

คุณได้เรียนรู้คิวข้อความ POSIX

  • แลกเปลี่ยนข้อความที่แยกเป็นหน่วย ไม่ใช่ไบต์ดิบ
  • mq_open, mq_send, mq_receive
  • การส่งจะเรียงตามลำดับความสำคัญ แล้วจึงตามลำดับการมาถึง
  • มีรูปแบบไม่บล็อกและรูปแบบกำหนดเวลาให้เลือก และล้างทรัพยากรด้วย mq_close และ mq_unlink
เริ่มต้นได้ฟรี

เรียนรู้ C ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
144

คำถามที่พบบ่อย

บทเรียน “คิวข้อความ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คิวข้อความ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คิวข้อความ”

การส่งข้อความแบบมีโครงสร้าง คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “คิวข้อความ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ไปป์
  2. หน่วยความจำร่วม
  3. คิวข้อความ
  4. สัญญาณ
← กลับไปที่ C Academy