今天学习msgsnd()函数后发现,在调用ipcrm -q [id]后,再次调用后会出现msgsnd error: Invalid argument错误。具体过程如下:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
typedef struct {
long type;
char mtext[512];
} MSG;
int main(int argc, char *argv[])
{
if (argc < 2) {
fprintf(stderr, "usage:%s key\n", argv[0]);
exit(1);
}
// 指定参数1为消息队列的key
key_t key = atoi(argv[1]);
printf("key: %d\n", key);
int msq_id;
if ((msq_id = msgget(key, IPC_CREAT | IPC_EXCL | 0666) < 0)) {
perror("msgget error");
}
printf("msq id: %d\n", msq_id);
MSG m1 = {4, "1" };
MSG m2 = {1, "2" };
MSG m3 = {2, "3"};
MSG m4 = {6, "4" };
MSG m5 = {6, "5"};
if (msgsnd(msq_id, (void*)&m1, sizeof(MSG)-sizeof(long), IPC_NOWAIT) < 0) {
perror("msgsnd error");
}
if (msgsnd(msq_id, &m2, sizeof(MSG)-sizeof(m2.type), IPC_NOWAIT) < 0) {
perror("msgsnd error");
}
if (msgsnd(msq_id, &m3, sizeof(MSG)-sizeof(m2.type), IPC_NOWAIT) < 0) {
perror("msgsnd error");
}
if (msgsnd(msq_id, &m4, sizeof(MSG)-sizeof(m2.type), IPC_NOWAIT) < 0) {
perror("msgsnd error");
}
if (msgsnd(msq_id, &m5, sizeof(MSG)-sizeof(m2.type), IPC_NOWAIT) < 0) {
perror("msgsnd error");
}
// 获得消息队列总数
struct msqid_ds ds;
if (msgctl(msq_id, IPC_STAT, &ds) < 0) {
perror("msgctl error");
}
printf("msg total: %ld\n", ds.msg_qnum);
return 0;
}
编译程序为a.out,执行
./a.out 10
此时一切正常,当调用系统命令
ipcrm --all=msg -v
之后,再次 ./a.out 3后,出现
key: 3
msq id: 0
msgsnd error: Invalid argument
msgsnd error: Invalid argument
msgsnd error: Invalid argument
msgsnd error: Invalid argument
msgsnd error: Invalid argument
msgctl error: Invalid argument
msg total: 17179869188
想问这是怎么回事?在虚拟机kali(Linux kali 5.5.0-kali1-amd64 #1 SMP Debian 5.5.13-2kali1 (2020-04-03) x86_64 GNU/Linux)同样出现相同的问题
本机 manjaro(Linux nsfoxerpc 5.4.40-1-MANJARO #1 SMP PREEMPT Sun May 10 14:17:40 UTC 2020 x86_64 GNU/Linux) 希望大佬解决问题,谢谢