C语言整理之消息队列

本文介绍了如何使用C语言实现基于消息队列的进程间通信。通过`msgget`创建消息队列,`msgsnd`发送消息,`msgrcv`接收消息,以及`msgctl`控制消息队列。两个示例程序展示了发送和接收进程的逻辑,当接收到特定字符串"end"时,通信结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言消息队列

 

MsgQueue1.c

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <signal.h>

 

 

#define  KEY   1234

 

struct msgbuf

{

    long mtype;     /* message type, must be > 0 */

char mbuf[100];  /* message data */

};

//typedef struct msgbuf buf;

 

int main()

{

int msgid,ret;

pid_t pid;

struct msgbuf buf;

 

msgid = msgget(KEY,IPC_CREAT | IPC_EXCL);

if(-1 == msgid)

{

perror("msgget");

### C语言中优先队列的实现与使用方法 #### 什么是优先队列? 优先队列是一种特殊的队列数据结构,其中每个元素都有一个关联的优先级。高优先级的元素会先于低优先级的元素被处理。通常可以使用堆(Heap)来高效地实现优先队列[^2]。 --- #### 堆的概念及其操作 堆是一棵完全二叉树,分为最大堆和最小堆两种形式: - **最大堆**:父节点的关键字大于等于子节点的关键字。 - **最小堆**:父节点的关键字小于等于子节点的关键字。 常见的堆操作包括: 1. 插入新元素 (`heap_insert`)。 2. 提取具有最高优先级的元素 (`heap_extract_max` 或 `heap_extract_min`)。 3. 修改某个元素的优先级 (`heap_increase_key` 或 `heap_decrease_key`)。 这些操作都可以在 \(O(\log n)\) 时间内完成。 --- #### 使用数组模拟堆结构 由于堆是完全二叉树,可以用数组来存储其节点。对于任意位置索引为 \(i\) 的节点: - 左孩子的位置为 \(2i\). - 右孩子的索引为 \(2i + 1\). - 父节点的索引为 \(\lfloor i/2 \rfloor\). 这种映射关系使得我们可以方便地通过简单的算术运算访问父子节点的关系。 --- #### C语言中的优先队列实现 以下是一个完整的优先队列(最大堆)的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #define MAX_HEAP_SIZE 100 #define MIN -100000 typedef struct { int *arr; int size; } Heap; // 初始化堆 void init_heap(Heap *h) { h->arr = (int *)malloc((MAX_HEAP_SIZE + 1) * sizeof(int)); // 多分配一位用于简化逻辑 h->size = 0; } // 维护最大堆性质 void max_heapify(Heap *h, int pos) { int largest = pos; int left = 2 * pos; int right = 2 * pos + 1; if (left <= h->size && h->arr[left] > h->arr[largest]) { largest = left; } if (right <= h->size && h->arr[right] > h->arr[largest]) { largest = right; } if (largest != pos) { int tmp = h->arr[pos]; h->arr[pos] = h->arr[largest]; h->arr[largest] = tmp; max_heapify(h, largest); } } // 获取当前最大值 int heap_max(Heap *h) { return h->arr[1]; } // 删除并返回最大值 int heap_extract_max(Heap *h) { if (h->size < 1) { printf("Error: Heap underflow\n"); exit(EXIT_FAILURE); } int max = h->arr[1]; h->arr[1] = h->arr[h->size]; h->size--; max_heapify(h, 1); return max; } // 增加指定位置的键值 void heap_increase_key(Heap *h, int pos, int key) { if (key < h->arr[pos]) { printf("New key is smaller than current key.\n"); return; } h->arr[pos] = key; while (pos > 1 && h->arr[pos / 2] < h->arr[pos]) { int tmp = h->arr[pos]; h->arr[pos] = h->arr[pos / 2]; h->arr[pos / 2] = tmp; pos /= 2; } } // 向堆中插入新的关键字 void heap_insert(Heap *h, int key) { h->size++; h->arr[h->size] = MIN; // 将最后一个元素初始化为极小值 heap_increase_key(h, h->size, key); } // 打印堆的内容 void print_heap(Heap *h) { for (int i = 1; i <= h->size; i++) { printf("%d ", h->arr[i]); } printf("\n"); } // 主函数测试 int main() { Heap myHeap; init_heap(&myHeap); heap_insert(&myHeap, 4); heap_insert(&myHeap, 8); heap_insert(&myHeap, 7); heap_insert(&myHeap, 9); heap_insert(&myHeap, 1); printf("Heap after insertions:\n"); print_heap(&myHeap); printf("Extracted Max Element: %d\n", heap_extract_max(&myHeap)); printf("Heap after extraction:\n"); print_heap(&myHeap); free(myHeap.arr); // 清理内存 return 0; } ``` --- #### 关键功能解析 1. **初始化堆** 函数 `init_heap` 创建了一个大小固定的数组,并将其作为堆的基础存储结构[^1]。 2. **维护堆属性** 函数 `max_heapify` 是核心部分之一,负责调整堆使其满足最大堆的定义[^2]。 3. **提取最大值** 函数 `heap_extract_max` 移除并返回堆顶元素,同时重新整理剩余元素以维持堆特性[^1]。 4. **增加键值** 函数 `heap_increase_key` 能够提升某特定项的优先级,这有助于动态更新优先队列的状态[^2]。 5. **插入新元素** 函数 `heap_insert` 首先把新项目放置到堆底端的一个空位处,随后调用 `heap_increase_key` 来适当定位新增成员[^1]。 --- #### 应用场景举例 优先队列广泛应用于各种领域,比如操作系统调度、Dijkstra最短路径算法以及Huffman编码等场合。它的主要优势在于能够快速获取集合内的最优选项,而无需遍历整个列表。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值