คิวข้อความ
การส่งข้อความแบบมีโครงสร้าง
คิวข้อความ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ไปป์
- หน่วยความจำร่วม
- คิวข้อความ
- สัญญาณ