用c语言写一个消息队列
时间: 2023-07-15 10:10:44 浏览: 107
在 C 语言中,可以使用共享内存和信号量来实现消息队列。以下是一些基本步骤:
1. 定义消息结构体,包含消息类型和消息内容等信息。
```c
typedef struct {
int type;
char data[1024];
} message_t;
```
2. 创建共享内存和信号量,用于存储消息和控制消息队列。
```c
int shmid = shmget(IPC_PRIVATE, sizeof(message_t) * MAX_MSGS, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
int semid = semget(IPC_PRIVATE, 1, IPC_CREAT | 0666);
if (semid == -1) {
perror("semget");
exit(EXIT_FAILURE);
}
union semun arg;
arg.val = 1;
if (semctl(semid, 0, SETVAL, arg) == -1) {
perror("semctl");
exit(EXIT_FAILURE);
}
```
3. 定义发送和接收消息的函数,使用信号量进行同步和互斥。
```c
void send_message(message_t *msg) {
struct sembuf sem_op;
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = SEM_UNDO;
if (semop(semid, &sem_op, 1) == -1) {
perror("semop");
exit(EXIT_FAILURE);
}
message_t *msgs = shmat(shmid, NULL, 0);
msgs[num_msgs++] = *msg;
sem_op.sem_op = 1;
if (semop(semid, &sem_op, 1) == -1) {
perror("semop");
exit(EXIT_FAILURE);
}
}
void recv_message(message_t *msg, int type) {
struct sembuf sem_op;
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = SEM_UNDO;
if (semop(semid, &sem_op, 1) == -1) {
perror("semop");
exit(EXIT_FAILURE);
}
message_t *msgs = shmat(shmid, NULL, 0);
for (int i = 0; i < num_msgs; i++) {
if (msgs[i].type == type) {
*msg = msgs[i];
for (int j = i; j < num_msgs - 1; j++) {
msgs[j] = msgs[j + 1];
}
num_msgs--;
break;
}
}
sem_op.sem_op = 1;
if (semop(semid, &sem_op, 1) == -1) {
perror("semop");
exit(EXIT_FAILURE);
}
}
```
4. 在主函数中使用上述函数进行消息的发送和接收。
```c
int main() {
message_t msg1 = {1, "Hello, world!"};
message_t msg2 = {2, "Goodbye, world!"};
send_message(&msg1);
send_message(&msg2);
message_t msg;
recv_message(&msg, 1);
printf("%s\n", msg.data);
recv_message(&msg, 2);
printf("%s\n", msg.data);
return 0;
}
```
注意,上述代码只是一个简单的示例,实际应用中可能需要更多的错误处理和同步控制。
阅读全文