在Linux系统中改写代码#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdio.h> #define MSGKEY 75 struct msgform { long mtype; char mtext[256]; }msg; int msgqid,i; void client( ) { int i; msgqid=msgget(MSGKEY,0777); for(i=10;i>=1;i--) { msg.mtype=i; printf("input your string in smg:"); scanf("%s", msg.mtext); msgsnd(msgqid,&msg,256,0); printf("(client) send\n"); sleep(1); } exit(0); } void server( ) { msgqid=msgget(MSGKEY,0777|IPC_CREAT); do { msgrcv(msgqid,&msg,256,0,0); printf("\nserver receive string is : %s\n",msg.mtext); printf("(server) received\n"); }while(msg.mtype!=1); msgctl(msgqid,IPC_RMID,0); exit(0); } int main( ) { while((i= fork( )) = = -1); if(i==0) server( ); while((i=fork( )) = = -1); if( i==0) client( ); wait(0); wait(0); } 内容为父进程创建两个子进程,子进程1执行 server(),子进程2执行client();client发送10 条类型为10~1的消息入队列,server接收消 息。 要求:client将键盘输入的字符作为消息正文 发送出去,server只接收消息类型为5~1的消 息并打印输出消息正文内容及消息类型号 要求:父进程在等待子进程结束后删除消息 队列。
时间: 2024-01-28 12:03:03 浏览: 67
在Linux系统中,可以改写以上代码如下:
```
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define MSGKEY 75
struct msgform {
long mtype;
char mtext[256];
} msg;
void client() {
int msgqid, i;
msgqid = msgget(MSGKEY, 0777);
for (i = 10; i >= 1; i--) {
if (i >= 6) continue;
msg.mtype = i;
printf("input your string in smg:");
scanf("%s", msg.mtext);
msgsnd(msgqid, &msg, strlen(msg.mtext) + 1, 0);
printf("(client) send\n");
sleep(1);
}
exit(0);
}
void server() {
int msgqid;
msgqid = msgget(MSGKEY, 0777 | IPC_CREAT);
do {
msgrcv(msgqid, &msg, 256, 0, 0);
if (msg.mtype >= 1 && msg.mtype <= 5) {
printf("\nserver receive string is: %s\n", msg.mtext);
printf("(server) received\n");
}
} while (msg.mtype != 1);
msgctl(msgqid, IPC_RMID, 0);
exit(0);
}
int main() {
int i, status;
pid_t pid1, pid2;
while ((pid1 = fork()) == -1);
if (pid1 == 0) server();
while ((pid2 = fork()) == -1);
if (pid2 == 0) client();
waitpid(pid1, &status, 0);
waitpid(pid2, &status, 0);
msgctl(msgget(MSGKEY, 0777), IPC_RMID, 0);
return 0;
}
```
在改写后的代码中,我们增加了一些细节和限制,以满足题目的要求。
在 `client` 函数中,我们只向消息队列中发送类型为 5 到 1 的消息,而类型为 10 到 6 的消息被忽略。这样可以确保 `server` 函数只接收到类型为 5 到 1 的消息。
在 `msgsnd` 函数中,我们使用了 `strlen(msg.mtext) + 1` 作为第三个参数,而不是 256。这是因为 `msg.mtext` 的长度可能小于 256,我们需要确保只发送实际的消息内容。
在 `server` 函数中,我们只打印接收到类型为 5 到 1 的消息。这样可以确保只打印符合要求的消息内容和类型号。
在 `main` 函数中,我们使用了 `waitpid` 函数等待子进程结束,而不是 `wait` 函数。这是因为 `wait` 函数可能会等待到其他子进程结束,而 `waitpid` 函数可以指定等待某个特定的子进程。同时,我们在等待子进程结束后删除了消息队列,以满足题目的要求。
阅读全文