1、将消息队列发送接收端实现一遍。
2、将共享内存发送接收实现一遍。
3、建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样。
#include <myhead.h>
typedef struct date
{
long mtype;//号
char mtext[100];//文本
}Date;
#define LEN sizeof(Date)-sizeof(long)
int main(int argc, const char *argv[])
{
//建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样。
pid_t pid = fork();
if(pid == 0)//子进程
{
key_t key = ftok("./",'8');//钥匙
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID;
msgID = msgget(key,IPC_CREAT|0666);
if(msgID==-1)
{
perror("msgget");
return -1;
}
Date abc;
while(1)
{
msgrcv(msgID,&abc,LEN,0,0);
printf("%s\n",abc.mtext);
if(strcmp(abc.mtext,"quit")==0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else if(pid >0)//父进程
{
key_t key = ftok("./",'A');//钥匙
if(key==-1)
{
perror("ftok");
return -1;
}
int mgsID;
mgsID = msgget(key,IPC_CREAT|0666);
if(mgsID==-1)
{
perror("msgget");
return -1;
}
Date data;
while (1)
{
printf("请输入消息类型(输入0退出):");
scanf("%ld",&data.mtype);
getchar();
if (data.mtype == 0)
{
printf("结束输入\n");
break;
}
printf("请输入消息内容:");
if (fgets(data.mtext, sizeof(data.mtext), stdin) == NULL)
{
perror("fgets");
continue;
}
// 移除换行符
data.mtext[strcspn(data.mtext, "\n")] = 0;
// 发送消息
if (msgsnd(mgsID, &data, LEN, 0) == -1)
{
perror("msgsnd");
continue;
}
printf("消息已发送\n");
}
// 删除消息队列
if (msgctl(mgsID, IPC_RMID, NULL) == -1)
{
perror("msgctl");
return -1;
}
printf("消息队列已删除\n");
wait(NULL);
exit(EXIT_SUCCESS);
}
else
{
perror("fork");
return -1;
}
return 0;
}
#include <myhead.h>
typedef struct date
{
long mtype;//号
char mtext[100];//文本
}Date;
#define LEN sizeof(Date)-sizeof(long)
int main(int argc, const char *argv[])
{
//建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样。
pid_t pid = fork();
if(pid == 0)//子进程
{
key_t key = ftok("./",'A');//钥匙
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID;
msgID = msgget(key,IPC_CREAT|0666);
if(msgID==-1)
{
perror("msgget");
return -1;
}
Date abc;
while(1)
{
msgrcv(msgID,&abc,LEN,0,0);
printf("%s\n",abc.mtext);
if(strcmp(abc.mtext,"quit\n")==0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else if(pid >0)//父进程
{
key_t key = ftok("./",'8');//钥匙
if(key==-1)
{
perror("ftok");
return -1;
}
int msgID;
msgID = msgget(key,IPC_CREAT|0666);
if(msgID==-1)
{
perror("msgget");
return -1;
}
Date data;
while (1)
{
printf("请输入消息类型(输入0退出):");
scanf("%ld",&data.mtype);
getchar();
if (data.mtype == 0)
{
printf("结束输入\n");
break;
}
printf("请输入消息内容:");
if (fgets(data.mtext, sizeof(data.mtext), stdin) == NULL)
{
perror("fgets");
continue;
}
// 移除换行符
data.mtext[strcspn(data.mtext, "\n")] = 0;
// 发送消息
if (msgsnd(msgID, &data, LEN, 0) == -1)
{
perror("msgsnd");
continue;
}
printf("消息已发送\n");
}
// 删除消息队列
if (msgctl(msgID, IPC_RMID, NULL) == -1)
{
perror("msgctl");
return -1;
}
printf("消息队列已删除\n");
wait(NULL);
exit(EXIT_SUCCESS);
}
else
{
perror("fork");
return -1;
}
return 0;
}