linux设计程序实现功能:1.设计两个独立进程,即发送进程和接收进程,通过消息队列进行进程通信,以“end”作为结束消息2.修改上题,将两个程序合并为一个,通过父进程创建一个子进程,子进程发送消息,父进程接收消息,以“end”作为结束信息给出详细代码
时间: 2024-01-05 09:04:04 浏览: 57
linux 程序设计简单总结
第一个问题的代码:
发送进程:
```c
#include <stdio.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#define MSG_SIZE 1024
#define MSG_TYPE 1
typedef struct msgbuf {
long mtype;
char mtext[MSG_SIZE];
}MsgBuf;
int main() {
int msgid;
MsgBuf msg;
msgid = msgget(IPC_PRIVATE, 0666|IPC_CREAT); // 创建消息队列
if (msgid == -1) {
perror("msgget error:");
exit(1);
}
printf("请输入要发送的消息,输入 end 结束:\n");
while (fgets(msg.mtext, MSG_SIZE, stdin) != NULL) {
msg.mtype = MSG_TYPE;
if (strcmp(msg.mtext, "end\n") == 0) {
break;
}
if (msgsnd(msgid, &msg, strlen(msg.mtext), 0) == -1) { // 发送消息
perror("msgsnd error:");
exit(1);
}
}
if (msgctl(msgid, IPC_RMID, NULL) == -1) { // 删除消息队列
perror("msgctl error:");
exit(1);
}
return 0;
}
```
接收进程:
```c
#include <stdio.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#define MSG_SIZE 1024
#define MSG_TYPE 1
typedef struct msgbuf {
long mtype;
char mtext[MSG_SIZE];
}MsgBuf;
int main() {
int msgid;
MsgBuf msg;
msgid = msgget(IPC_PRIVATE, 0666|IPC_CREAT); // 创建消息队列
if (msgid == -1) {
perror("msgget error:");
exit(1);
}
while (1) {
if (msgrcv(msgid, &msg, MSG_SIZE, MSG_TYPE, 0) == -1) { // 接收消息
perror("msgrcv error:");
exit(1);
}
printf("接收到消息:%s", msg.mtext);
if (strcmp(msg.mtext, "end\n") == 0) {
break;
}
}
return 0;
}
```
第二个问题的代码:
```c
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#define MSG_SIZE 1024
#define MSG_TYPE 1
typedef struct msgbuf {
long mtype;
char mtext[MSG_SIZE];
}MsgBuf;
int main() {
int msgid;
MsgBuf msg;
pid_t pid;
msgid = msgget(IPC_PRIVATE, 0666|IPC_CREAT); // 创建消息队列
if (msgid == -1) {
perror("msgget error:");
exit(1);
}
pid = fork(); // 创建子进程
if (pid == -1) {
perror("fork error:");
exit(1);
}
else if (pid == 0) { // 子进程发送消息
printf("子进程发送消息:\n");
while (fgets(msg.mtext, MSG_SIZE, stdin) != NULL) {
msg.mtype = MSG_TYPE;
if (strcmp(msg.mtext, "end\n") == 0) {
break;
}
if (msgsnd(msgid, &msg, strlen(msg.mtext), 0) == -1) { // 发送消息
perror("msgsnd error:");
exit(1);
}
}
exit(0);
}
else { // 父进程接收消息
printf("父进程接收消息:\n");
while (1) {
if (msgrcv(msgid, &msg, MSG_SIZE, MSG_TYPE, 0) == -1) { // 接收消息
perror("msgrcv error:");
exit(1);
}
printf("接收到消息:%s", msg.mtext);
if (strcmp(msg.mtext, "end\n") == 0) {
break;
}
}
wait(NULL); // 等待子进程结束
if (msgctl(msgid, IPC_RMID, NULL) == -1) { // 删除消息队列
perror("msgctl error:");
exit(1);
}
}
return 0;
}
```
阅读全文