一、无名管道
无名管道是Linux中管道通信的一种原始方法,如图所示
1.只能用于具有亲缘关系的进程之间的通信(父子进程或兄弟进程)
2.是一个单工的通信模式,具有固定的读端和写端
3.管道也可以看成一种特殊的文件,对于它的读写也可以使用普通的read()、write()等函数。但是它不属于任何文件系统,并且只存在于内核内存中
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
int pfd[2];
int re;
int i;
pid_t pid;
re=pipe(pfd);
char buf[20]={0};
if(re<0)
{
perror("pipe");
return 0;
}
for(i=0;i<2;i++){
pid=fork();
if(pid<0){
perror("pid");
}else if(pid>0)
{
}
else{
break;
}
}
if(i==0)
{
close(pfd[0]);
while(1){
strcpy(buf,"this is 1 process\n");
write(pfd[1],buf,strlen(buf));
sleep(1);
}
return 0;
}
if(i==1)
{
close(pfd[0]);
while(1){
strcpy(buf,"this is 2 process\n");
write(pfd[1],buf,strlen(buf));
sleep(1);
}
return 0;
}
if(i==2)
{
close(pfd[1]);
while(1)
{
memset(buf,0,20);
re=read(pfd[0],buf,20);
if(re>0){
printf("%s\n",buf);
}
}
return 0;
}
}
二、有名管道
有名管道是无名管道的一种改进,如图所示
它具有以下特点:
1.它可以使两个互不相关的进程实现彼此通信
2.该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了有名管道之后,两个进程就可以把它当作普通文件进行读写操作,使用非常方便
3.FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加的末尾。有名管道不支持如sleek()等文件定位操作
写入字符
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
int re;
int fd;
char buf[32];
re=mkfifo("/myfifo",0666);
if(re<0){
perror("mkfifo");
// return 0;
}
fd=open("/myfifo",O_WRONLY);
while(1){
fgets(buf,32,stdin);
write(fd,buf,strlen(buf));
}
}
读取写入字符
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int re;
int fd;
char buf[32]={0};
/* re=mkfifo("/myfifo",0666);
if(re<0){
perror("mkfifo");
return 0;
*/
fd=open("/myfifo",O_RDONLY);
if(fd<0){
perror("open");
return 0;
}
while(1){
re=read(fd,buf,32);
if(re>0){ printf("read fifo=%s\n",buf);
}else if(re==0)
{
exit(0);
}
}
}
可以实时读取键盘输入内容