最近在学习linux 进程间通讯,自己写了段代码做测试,第一次实验比较成功,但是第二次运行的时候就出现错误:msgrcv: Identifier removed, 看信息应该是msgctl的IPC_RMID操作的问题,现在我有三个问题拜托大神一一解答:代码如下:
(1):为什么第一次成功而后面几次的运行就会报错?
(2):如果说是删除了消息队列的原因,可是第二次,第三次运行的时候代码又创建了消息队列啊为什么还是不行?
(3):如果不能在程序中删除消息队列,那消息队列不用了怎么删除呢?
#define BUF_SIZE 512
struct msgsag {
long msg_type;
char msg_text[BUF_SIZE];
};
int main(int argc, const char *argv[])
{
key_t key;
int msgid;
struct msgsag msg;
//获取key值
if((key = ftok(".", 1)) == -1)
{
perror("ftok\n");
exit(1);
}
//创建消息队列 (第二次运行的时候又创建了啊)
if(msgid = msgget(key, IPC_CREAT|0666) == -1)
{
perror("msgget");
exit(1);
}
do
{
memset(msg.msg_text, 0, BUF_SIZE);
if(msgrcv(msgid, (void *)&msg, sizeof(msg.msg_text), (long) 0, 0) == -1)
{
perror("msgrcv");
exit(1);
}
printf("msg_type = %ld, msg_text = %s\n", msg.msg_type, msg.msg_text);
}while(strncmp(msg.msg_text, "quit", 4));
//从系统内核中移除消息队列
if(msgctl(msgid, IPC_RMID, NULL) == -1)
{
perror("msgctl");
exit(1);
}
return 0;
}
|