进程间通信之消息队列

下面是一个简单的进程间通信(IPC)消息队列实例,使用了Linux系统中的msgget()、msgsnd()和msgrcv()函数:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFFER_SIZE 1024
#define MSG_KEY 1234

struct msgbuf {
    long mtype;
    char mtext[BUFFER_SIZE];
};

int main(void) {
    int msqid; // 用于存储消息队列的ID
    pid_t pid;
    struct msgbuf msg;

    // 创建消息队列
    if ((msqid = msgget(MSG_KEY, IPC_CREAT | 0666)) < 0) {
        fprintf(stderr, "msgget error\n");
        exit(1);
    }

    if ((pid = fork()) < 0) { // 创建子进程
        fprintf(stderr, "fork error\n");
        exit(1);
    } else if (pid > 0) { // 父进程
        printf("Parent process sending message...\n");
        msg.mtype = 1;
        char *msg_text = "Hello, child process!";
        strncpy(msg.mtext, msg_text, BUFFER_SIZE);
        if (msgsnd(msqid, &msg, strlen(msg_text) + 1, 0) < 0) { // 向消息队列发送消息
            fprintf(stderr, "msgsnd error\n");
            exit(1);
        }
        printf("Parent process finished sending message.\n");
    } else { // 子进程
        printf("Child process receiving message...\n");
        if (msgrcv(msqid, &msg, BUFFER_SIZE, 1, 0) < 0) { // 从消息队列接收消息
            fprintf(stderr, "msgrcv error\n");
            exit(1);
        }
        printf("Child process received message: %s\n", msg.mtext);
        printf("Child process finished receiving message.\n");
    }

    // 删除消息队列
    if (msgctl(msqid, IPC_RMID, NULL) < 0) {
        fprintf(stderr, "msgctl error\n");
        exit(1);
    }

    return 0;
}

该程序创建了一个消息队列,然后创建了一个子进程。父进程向消息队列中发送一条消息,子进程从消息队列中接收这条消息并输出。注意,程序需要在最后删除消息队列,否则消息队列将一直存在于系统中。

该程序可以通过编译器(如gcc)进行编译,然后在Linux系统上运行。

你可能感兴趣的:(内核基础篇,linux,消息队列)