linux 使用系统调用msgget( ), megsnd( ), msgrev( )及msgctl()编制一长度为1K的消息发送和接收的程序 。
时间: 2024-05-06 13:19:01 浏览: 112
下面是一个使用系统调用msgget( ), megsnd( ), msgrev( )及msgctl()编制的发送和接收消息的程序:
发送消息的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_SIZE 1024
struct msgbuf {
long mtype;
char mtext[MSG_SIZE];
};
int main(int argc, char *argv[])
{
key_t key;
int msqid;
struct msgbuf buf;
int len;
if(argc != 2) {
fprintf(stderr, "Usage: %s <msg>\n", argv[0]);
exit(EXIT_FAILURE);
}
if((key = ftok(".", 'M')) == -1) {
perror("ftok");
exit(EXIT_FAILURE);
}
if((msqid = msgget(key, 0666 | IPC_CREAT)) == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
buf.mtype = 1;
strncpy(buf.mtext, argv[1], MSG_SIZE);
len = strlen(buf.mtext) + 1;
if(msgsnd(msqid, &buf, len, 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
printf("Message sent: %s\n", buf.mtext);
exit(EXIT_SUCCESS);
}
```
接收消息的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_SIZE 1024
struct msgbuf {
long mtype;
char mtext[MSG_SIZE];
};
int main(int argc, char *argv[])
{
key_t key;
int msqid;
struct msgbuf buf;
if((key = ftok(".", 'M')) == -1) {
perror("ftok");
exit(EXIT_FAILURE);
}
if((msqid = msgget(key, 0666 | IPC_CREAT)) == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
if(msgrcv(msqid, &buf, MSG_SIZE, 1, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
printf("Message received: %s\n", buf.mtext);
if(msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
```
在这里,我们使用了 ftok 函数来创建一个唯一的键值,用于 msgget 函数创建消息队列。然后,我们使用 msgsnd 函数发送消息,msgrcv 函数接收消息,msgctl 函数删除消息队列。
注意,我们使用了一个结构体 msgbuf 来传递消息,其中包含了消息类型和消息内容。在这个例子中,我们只使用了一种消息类型。
阅读全文