编写一个程序,使用系统调用msgget(), msgsnd(), msgrcv(), msgctl()实现消息的发送和接收,一个子进程发送10条消息,一个子进程接收10条消息。(MSGKEY取值75,消息的长度取1024)
时间: 2024-02-19 12:58:30 浏览: 139
好的,我可以为您提供一个基于Linux系统调用的C语言程序示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSGKEY 75
#define MSGSIZE 1024
struct msgbuf {
long mtype;
char mtext[MSGSIZE];
};
int main() {
int msgid;
pid_t pid;
struct msgbuf message;
int i;
// 创建消息队列
if ((msgid = msgget(MSGKEY, IPC_CREAT | 0666)) == -1) {
perror("msgget");
exit(1);
}
// 创建子进程
if ((pid = fork()) == -1) {
perror("fork");
exit(1);
}
if (pid == 0) {
// 子进程发送10条消息
for (i = 0; i < 10; i++) {
message.mtype = 1;
sprintf(message.mtext, "Message %d from child", i+1);
if (msgsnd(msgid, &message, strlen(message.mtext)+1, 0) == -1) {
perror("msgsnd");
exit(1);
}
printf("Child sent message: %s\n", message.mtext);
}
exit(0);
} else {
// 父进程接收10条消息
for (i = 0; i < 10; i++) {
if (msgrcv(msgid, &message, MSGSIZE, 1, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("Parent received message: %s\n", message.mtext);
}
// 销毁消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(1);
}
exit(0);
}
}
```
程序首先通过`msgget()`创建一个消息队列,然后通过`fork()`创建一个子进程。子进程使用`msgsnd()`发送10条消息,父进程使用`msgrcv()`接收10条消息,最后父进程使用`msgctl()`销毁消息队列。
注意,程序中的消息类型`mtype`都被设置为1,这样消息发送和接收双方都可以使用同一个类型接口。如果需要使用多个类型,可以在`struct msgbuf`中定义多个`mtext`,每个`mtext`对应一个类型。在发送和接收消息时,需要指定对应的类型。
阅读全文