作业 利用信息队列完成通信
进程A
#include<myhead.h>
//要发送的消息类型
struct msgbuf
{
long mtype;
char mtext[1024];
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
//定义信号函数,子进程让父进程阻塞回收 并自裁
void handler(int singo)
{
if(singo==SIGUSR1)
{
wait(NULL);
raise(SIGKILL);
}
}
int main(int argc, const char *argv[])
{
//信号函数
if(signal(SIGUSR1, handler) == SIG_ERR)
{
perror("signal error");
return -1;
}
//创建key 用于生产消息队列
key_t key=ftok("/",'k');
if(key==-1)
{
perror("ftok error");
return -1;
}
//生产一个消息队列
int msqid=msgget(key,IPC_CREAT|0664);
if(msqid==-1)
{
perror("msgget error");
return -1;
}
//向消息队列中存放消息
struct msgbuf send;
send.mtype=1;
struct msgbuf receive;
receive.mtype=2;
printf("可以开始聊天了\n");
pid_t pid=fork();
if(pid>0)
{ //父进程
while(1)
{
printf("请输入正文内容>>>\n");
fgets(send.mtext,SIZE,stdin); //从终端获取数据
send.mtext[strlen(send.mtext)-1]=0;
//将消息发送到队列
msgsnd(msqid,&send,SIZE,0);
if(strcmp(send.mtext,"quit")==0)
{
break;
}
}
}
else if(pid==0)
{
//子进程
while(1)
{
msgrcv(msqid,&receive,SIZE,2,0);
printf("收到消息:%s\n",receive.mtext);
if(strcmp(receive.mtext,"quit")==0)
{
break;
}
}
kill(pid,SIGUSR1); //接受消息端发送信号给父进程
exit(EXIT_SUCCESS);
}else if(pid<0)
{
perror("fork error");
return -1;
}
kill(pid,SIGKILL); //父进程结束则杀死孤儿 回收之
wait(NULL);
msgctl(msqid,IPC_RMID,0); //发送段完成删除
return 0;
}
进程B
#include<myhead.h>
//要发送的消息类型
struct msgbuf
{
long mtype;
char mtext[1024];
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
//定义信号函数,子进程让父进程阻塞回收并自裁,
void handler(int signo)
{
if(signo==SIGUSR1)
{
wait(NULL);
raise(SIGKILL);
}
}
int main(int argc, const char *argv[])
{
//信号函数
if(signal(SIGUSR1, handler) == SIG_ERR)
{
perror("signal error");
return -1;
}
//创建key 用于生产消息队列
key_t key=ftok("/",'k');
if(key==-1)
{
perror("ftok error");
return -1;
}
//生产一个消息队列
int msqid=msgget(key,IPC_CREAT|0664);
if(msqid==-1)
{
perror("msgget error");
return -1;
}
//向消息队列中存放消息
struct msgbuf send;
send.mtype=2;
struct msgbuf receive;
receive.mtype=1;
printf("可以开始聊天了\n");
pid_t pid=fork();
if(pid>0)
{
//父进程
while(1)
{
printf("请输入正文内容>>>\n");
fgets(send.mtext,SIZE,stdin); //从终端获取数据
send.mtext[strlen(send.mtext)-1]=0;
//将消息发送到队列
msgsnd(msqid,&send,SIZE,0);
if(strcmp(send.mtext,"quit")==0)
{
break;
}
}
}else if(pid==0)
{
//子进程
while(1)
{
msgrcv(msqid,&receive,SIZE,1,0);
printf("收到消息:%s\n",receive.mtext);
if(strcmp(receive.mtext,"quit")==0)
{
break;
}
}
kill(pid,SIGUSR1); //接受消息端发送信号给父进程
exit(EXIT_SUCCESS);
}else
{
perror("fork error");
return -1;
}
kill(pid,SIGKILL); //父进程结束则杀死孤儿 回收之
wait(NULL);
msgctl(msqid,IPC_RMID,0); //发送端完成删除
return 0;
}
进程A退出
进程b退出、
思维导图