亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

使用msgrcv接收消息時如何設置超時參數

小樊
136
2024-09-07 09:31:50
欄目: 編程語言

在Linux系統中,msgrcv函數用于從消息隊列中接收消息

以下是一個使用msgrcvalarm設置超時的示例:

#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<signal.h>

// 定義消息結構體
typedef struct {
    long mtype;
    char mtext[100];
} message_t;

// 信號處理函數,用于處理超時信號
void timeout_handler(int signum) {
    printf("Timeout occurred.\n");
    exit(1);
}

int main() {
    key_t key = ftok("/tmp", 123); // 生成鍵值
    int msgid = msgget(key, 0666 | IPC_CREAT); // 獲取或創建消息隊列

    if (msgid == -1) {
        perror("msgget failed");
        exit(1);
    }

    message_t msg;
    msg.mtype = 1; // 消息類型

    // 設置超時時間為5秒
    signal(SIGALRM, timeout_handler);
    alarm(5);

    // 使用msgrcv接收消息
    if (msgrcv(msgid, &msg, sizeof(msg.mtext), 1, 0) == -1) {
        perror("msgrcv failed");
        exit(1);
    }

    // 取消超時
    alarm(0);

    printf("Received message: %s\n", msg.mtext);

    // 刪除消息隊列
    if (msgctl(msgid, IPC_RMID, NULL) == -1) {
        perror("msgctl failed");
        exit(1);
    }

    return 0;
}

在這個示例中,我們首先定義了一個消息結構體message_t,然后使用ftok生成鍵值,并使用msgget創建或獲取消息隊列。接著,我們設置了一個超時時間為5秒的信號處理函數timeout_handler,并使用alarm函數設置超時。

然后,我們使用msgrcv函數接收消息。如果在5秒內沒有接收到消息,程序將觸發超時信號,調用timeout_handler函數并退出。如果成功接收到消息,我們會取消超時并輸出接收到的消息。最后,我們使用msgctl刪除消息隊列。

0
闸北区| 铁力市| 明光市| 察隅县| 滦平县| 肥东县| 靖宇县| 修武县| 类乌齐县| 威海市| 扶沟县| 娄烦县| 成都市| 绿春县| 黄浦区| 中宁县| 东莞市| 盐源县| 巴林右旗| 鲁山县| 镇远县| 会泽县| 巴塘县| 周至县| 沅陵县| 德保县| 宝应县| 云和县| 涿州市| 永善县| 丰城市| 丰镇市| 图木舒克市| 余江县| 秦安县| 洛隆县| 苏尼特右旗| 元谋县| 民和| 鹤庆县| 吕梁市|