#include #include // 系统数据类型定义 #include // IPC相关头文件 #include // 消息队列相关头文件 #include // 字符串操作 #include // atol 函数 #include // 时间函数 #include // 头文件含义:unix standard,即unix标准的意思 // 消息结构体 typedef struct msg_ { long mType; // 消息类型,必须是 long ,必须在第一个位置 char content[100]; // 消息内容,需要小于消息队列的限制值(8192) char title[32]; // 消息标题 } MSG; // msgget 函数用于创建消息队列,参数1是键值,参数2是权限 int main(int argc, char *argv[]) { key_t key = ftok("/", 200); // 获取消息队列的键值 int msgqid = msgget(key, IPC_CREAT | 0666); // 创建消息队列 if (msgqid == -1) { perror("msgget"); return 1; } // 查看 msgqid 消息队列的信息 struct msqid_ds msginfo; // 消息队列信息结构体 int ret = msgctl(msgqid, IPC_STAT, &msginfo); // 获取消息队列信息 if (ret == -1) { perror("msgctl"); return 1; } time_t st = msginfo.msg_stime; // 最后发送消息的时间 time_t rt = msginfo.msg_rtime; // 最后接收消息的时间 time_t ct = msginfo.msg_ctime; // 最后变更消息的时间 struct tm *stm = localtime(&st); // 转换为北京时间 struct tm *rtm = localtime(&rt); // 转换为北京时间 struct tm *ctm = gmtime(&ct); // 转换为北京时间 // // 手动转换为北京时间 // st += 8 * 60 * 60; // rt += 8 * 60 * 60; // ct += 8 * 60 * 60; // // 把时间戳转换为字符串 // char stime[32] = ""; // char rtime[32] = ""; // char ctime[32] = ""; // ctime_r(&st, stime); // ctime_r(&rt, rtime); // ctime_r(&ct, ctime); // // 打印时间 // printf("最后发送消息的时间: %s", stime); // printf("最后接收消息的时间: %s", rtime); // printf("最后变更消息的时间: %s", ctime); // printf("最后变更消息的时间: %s", ctime); // + 1900 是因为 struct tm 结构体中的 tm_year 字段表示的是从1900年开始的年数的偏移量。 // +1 是因为 struct tm 结构体中的 tm_mon 字段表示的是月份的偏移量,范围是0-11,其中0表示一月,11表示十二月 printf("最后发送消息的时间: %d-%d-%d %d:%d:%d\n", stm->tm_year + 1900, stm->tm_mon + 1, stm->tm_mday, stm->tm_hour, stm->tm_min, stm->tm_sec); printf("最后接收消息的时间: %d-%d-%d %d:%d:%d\n", rtm->tm_year + 1900, rtm->tm_mon + 1, rtm->tm_mday, rtm->tm_hour, rtm->tm_min, rtm->tm_sec); printf("最后变更消息的时间: %d-%d-%d %d:%d:%d\n", ctm->tm_year + 1900, ctm->tm_mon + 1, ctm->tm_mday, ctm->tm_hour, ctm->tm_min, ctm->tm_sec); // 打印消息队列的信息 printf("\n消息队列的信息:\n"); printf("消息队列的标识符: %d\n", msginfo.msg_perm.__key); printf("消息队列的权限: %04o\n", msginfo.msg_perm.mode); // %04o 是八进制输出,占4位,不足4位前面补0 // 修改消息队列的权限 // msginfo.msg_perm.mode = 0644; // 修改权限 msginfo.msg_perm.mode |= 0111; // 修改权限,增加可执行权限 ret = msgctl(msgqid, IPC_SET, &msginfo); if (ret == -1) { perror("msgctl"); return 1; } printf("修改消息队列的权限为: %04o\n", msginfo.msg_perm.mode); // %04o 是八进制输出,占4位,不足4位前面补0 // execlp("ipcs", "ipcs", "-q", NULL); // 打印消息队列 // 减少权限 msginfo.msg_perm.mode &= ~0101; // 修改权限,减少可执行权限 ret = msgctl(msgqid, IPC_SET, &msginfo); if (ret == -1) { perror("msgctl"); return 1; } printf("修改消息队列的权限为: %04o\n", msginfo.msg_perm.mode); // %04o 是八进制输出,占4位,不足4位前面补0 execlp("ipcs", "ipcs", "-q", NULL); // 打印消息队列 return 0; }