面试题答案
一键面试msgget
函数:- 基本功能:用于创建一个新的消息队列或获取一个已有的消息队列标识符。它通过指定的键值(
key
)来标识消息队列。如果消息队列不存在且IPC_CREAT
标志被设置,则创建新的消息队列;如果消息队列已存在,则返回其标识符。 - 函数原型:
int msgget(key_t key, int msgflg);
- 基本功能:用于创建一个新的消息队列或获取一个已有的消息队列标识符。它通过指定的键值(
msgrcv
函数:- 基本功能:从指定的消息队列中接收消息。可以指定接收消息的类型,并将消息数据复制到指定的缓冲区中。每次调用
msgrcv
,会从消息队列中移除已接收的消息,通过多次调用msgrcv
接收消息,可逐步清空消息队列。 - 函数原型:
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
- 基本功能:从指定的消息队列中接收消息。可以指定接收消息的类型,并将消息数据复制到指定的缓冲区中。每次调用
msgctl
函数:- 基本功能:对消息队列进行控制操作,如删除消息队列等。要清空消息队列,最后使用该函数将消息队列彻底删除。
- 函数原型:
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
,当cmd
为IPC_RMID
时,用于删除消息队列。
使用顺序:
- 首先调用
msgget
获取消息队列标识符,例如:
key_t key = ftok(".", 'a');
int msqid = msgget(key, IPC_CREAT | 0666);
if (msqid == -1) {
perror("msgget");
return 1;
}
- 然后使用
msgrcv
循环接收消息,直到消息队列为空,示例代码如下:
struct mymsgbuf {
long mtype;
char mtext[256];
};
struct mymsgbuf buf;
while (msgrcv(msqid, &buf, sizeof(buf.mtext), 0, 0) != -1);
- 最后调用
msgctl
删除消息队列:
if (msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
return 1;
}