kimi寫程式碼:處理msgrcv返回E2BIG

joel-q發表於2024-07-18
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>

typedef struct {
    long mtype;
    char mtext[1024]; // 假設訊息文字的最大長度為1024位元組
} message;

int main() {
    key_t key = ftok("some_key_file", 'a');
    int msqid = msgget(key, 0666 | IPC_CREAT);
    if (msqid == -1) {
        perror("msgget");
        return 1;
    }

    message msg;
    ssize_t msglen = 0;
    while ((msglen = msgrcv(msqid, &msg, sizeof(msg.mtext), 1, MSG_NOERROR)) == -1) {
        if (errno == E2BIG) {
            fprintf(stderr, "Buffer too small, resizing...\n");
            // 這裡可以調整緩衝區大小,例如,可以增加mtext的大小
            // 然後重新嘗試接收訊息
        } else {
            perror("msgrcv");
            break;
        }
    }

    if (msglen > 0) {
        printf("Received message of type %ld with size %zd\n", msg.mtype, msglen);
        // 處理接收到的訊息
    }

    // 清理資源
    if (msgctl(msqid, IPC_RMID, NULL) == -1) {
        perror("msgctl");
    }

    return 0;
}

相關文章