有名管道
1 用mkfifo函数建立管道
2 unlink(“ ”)删除该文件
步骤
1,创建一个有名管道文件
2,一个程序只读方式打开管道文件 , 另一个程序只写方式打开文件
3 删除管道文件
消息队列
1.创建消息队列 用msgget函数
2读写消息队列 msgsnd函数 往消息队列写入数据,相当于发送
msgrcv函数 读出消息队列的数
3删除消息队列 msgctl函数
int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int msgflg)
int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg)可以看出这2个函数要传结构体类型的数据
3 ipcs -q 查找地址
4 ipcrm -q (id)删除
实现父子进程相互传数据和显示数据
1 先建立2个文件 vim msg1.c vim msg2.c
2
在msg1.c 中
1,先建立一个消息队列
2,然后用fork创建父子进程 //注意先后顺序
3,子进程发送数据 (发送时数据类型为1,为了msg2.c中父进程接受数据)
4,父进程接受数据 (接受msg2.c子进程发送的数据,类型为2)
5, 删除消息队列
3
在msg2.c中
1.先获取消息队列
2.用fork函数创建父子进程
3,子进程发送数据 (发送时数据类型为2,为了msg1.c中父进程接受数据)
4,父进程接受数据 (接受msg1.c子进程发送的数据,类型为1)
不需要删除消息队列
注意事项 加 if(!strcmp(m.mtext,“bye”))
{
break;
}
输入bye退出,如果用 Ctrl+C 退出, 会出现 file exits
ipcs -q 查找地址
ipcrm -q (id)删除
用这2条命令先删除,然后再编译执行
如何实现输入一个 “bye”,,,2个文件同时退出
思路:例如 msg1.c的子进程输入一个bye后,msg1.c中的父进程能接收到
所以在子进程中 这条命令
if(!strcmp(m.mtext,“bye”))
{
break;
}
改成 if(!strcmp(m.mtext,“bye”))
{
m.mtype=1;
msgsnd(msgid,&m,sizeof(m.mtext),0);
break;
}
父进程中 这条语句 if(!strcmp(m.mtext,“bye”))
{
break;
}
改成 if(!strcmp(m.mtext,“bye”))
{
kill(pid,SIGINT);
break;
}
同理可得
msg2.c相应的改成如下
在子进程中 这条命令
if(!strcmp(m.mtext,“bye”))
{
break;
}
改成 if(!strcmp(m.mtext,“bye”))
{
m.mtype=2;
msgsnd(msgid,&m,sizeof(m.mtext),0);
break;
}
父进程中 这条语句 if(!strcmp(m.mtext,“bye”))
{
break;
}
改成 if(!strcmp(m.mtext,“bye”))
{
kill(pid,SIGINT);
break;
}