今天来说一下linux管道
进程间通信:
1.普通文件:俩个进程访问同一个文件 先后顺序
2.文件映射虚拟内存: 父子之间
3.管道
4.信号
5.IPC 共享内存
6.IPC 消息队列
7.IPC 信号量
8.网络通信
现在说一下管道
一 管道:管道是个文件 FIFO First In First Out
(1)匿名管道:没有名字,父子进程之间
直接用文件描述符
fds[0]用来读
fds[1]用来写
1.创建文件描述符号 int fds[2];
2.把文件描述符号变成管道 pipe
3.使用管道进行通信
4.关闭 close
(2)有名管道:有名字
可以在同一主机上不同进程之间操作 有具体文件
1.创建管道文件(mkfifo)
2.打开管道文件
3.使用管道文件读/写
4.关闭
5.删除管道文件
二:匿名管道代码:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main()
{
int fds[2];
pipe(fds); //把文件描述符号变成管道
if(fork())
{ //使用管道通信
char temp[1024];
int r;
while(1)
{
r=read(fds[0],temp,1023);//读数据
if(r>0)
{
temp[r] = 0;
printf(">> %s\n",temp);
}
}
}
else
{
char temp[1024];
while(1)
{
memset(temp,0,1024);
printf("发送啥:");
scanf("%s",temp);
write(fds[1],temp,strlen(temp));
}
}
close(fds[0]);
close(fds[1]);
return 0;
}
三:有名管道代码
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
//创建管道文件(mkfifo)
int r = mkfifo("test.pipe",0666);
if(0 == r)
{
printf("创建管道文件:%m\n");
}
else
{
printf("创建管道文件失败:%m\n");
exit(-1);
}
//打开管道文件
int fd = open("test.pipe",O_WRONLY);
if(-1 == fd)printf("打开管道文件失败:%m\n"),unlink("test.pipe"),exit(-1);
printf("打开管道文件成功\n");
//使用管道文件 写
int n=0;
char buff[56];
while(1){
memset(buff,0,56);
sprintf(buff,"玩游戏:%d",++n);
write(fd,buff,strlen(buf));
sleep(1);
}
//关闭
close(fd);
//删除
unlink("test.pipe");
return
}
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int fd = open("test.pipe",O_RDONLY);
if(-1 == fd)
{
printf("打开管道文件失败:%m\n");
exit(-1);
}
printf("打开管道文件成功\n");
char buff[56];
int r;
while(1){
memset(buff,0,56);
r=read(fd,buff,55);
if(r>0)
{
buff[r] = 0;
printf(">>%s\n",buff);
}
}
close(fd);
return 0;
}