管道:

 #include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<wait.h> /*管道没有名字,只能用于有亲缘关系的进程间通信*/ typedef struct stu
{
int id;
char name[];
}Stu; int main()
{
int pfd[];
int ret=pipe(pfd);//创建管道(管道只能在父进程中创建) if(ret<)
perror("pipe");//判断是否创建成功 int pid=fork();//创建子进程
if (pid<)
perror("fork"); else if(pid>)//父进程写文件
{
close(pfd[]);//关闭读文件描述符
Stu s[];
int i;
for(i=;i<;i++)
{
printf("id=");
scanf("%d",&s[i].id);getchar();
printf("name=");
scanf("%s",s[i].name);getchar();
}
write(pfd[],s,*sizeof(Stu));//写文件,放入s数组
printf("id\tname\n"); close(pfd[]);//关闭写文件
waitpid(pid,NULL,);//等待子进程结束
return ;
} else if(pid==)//子进程读文件
{
close(pfd[]);//关闭写文件标识符
int i;
Stu s2[];
while()
{
ret=read(pfd[],s2,*sizeof(Stu));//读取文件放入s2数组
if(ret<)//判断读取是否成功
{
perror("read");
}
if(ret==)//判断是否读取完毕
{
printf("read over\n");
exit();
} else//输出读取文件
{
for(i=;i<;i++)
printf("%d\t%s\n",s2[i].id,s2[i].name);
i++;
}
}
close(pfd[]);//关闭读文件
return ;
}
}

运行结果:

id=1001    //---------------------------输入(写文件)
name=aaa
id=
name=bbb
id=
name=ccc
id=
name=ddd
id=
name=eee//---------------------------输出(读文件)
id name
aaa
bbb
ccc
ddd
eee
read over

FIFO(有名管道):

代码1:写文件程序

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
typedef struct stu
{
int id;
char name[];
}Stu; void fun(int sig)
{
printf("中断..\n");
return;
} int main()
{
int fd;
int ret;
char buf[];
signal(SIGPIPE,fun);//给一个已经关闭的终端发送信息会产生13信号 //创建管道
ret = mkfifo("file_f",);
if(ret<)
{
if(errno != EEXIST)//判断创建是否出错(除去已经创建错误)
{
perror("mkfifo");
return -;
}
}
printf("mkfifo success.\n"); //打开管道
printf("open ..\n");
fd = open("file_f",O_WRONLY);//只写方式打开
printf("open fd = %d\n",fd);
if(fd<)
{
printf("open error.\n");
} //写操作 Stu s[];int i;
//while(1)
printf("input the len\n");//输入创建多少个数据
int len;
scanf("%d",&len);
for(i=;i<len;i++)
{
printf("id="); scanf("%d",&s[i].id);getchar();
printf("name=");
scanf("%s",s[i].name);getchar();
} ret = write(fd,s,len*sizeof(struct stu) );//写入到数组中
if(ret<)
{
printf("write error.\n");
goto END;
} printf("write success.\n"); END:
close(fd);
return ;
}

代码2:读文件程序:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h> typedef struct stu
{
int id;
char name[];
}Stu; int main()
{
int fd;
int ret;
//创建
ret = mkfifo("file_f",);
if(ret<)
{
if(errno!=)
{
perror("mkfifo");
return -;
}
}
printf("mkfifo success.\n"); //打开管道
printf("open ..\n");
fd = open("file_f",O_RDONLY);
printf("open fd = %d\n",fd);
if(fd<)
{
printf("open error.\n");
}
printf("id\tname\n"); printf("in put the len\n");
int len;
scanf("%d",&len);//输入要读取几个数据 Stu s[];int i;
ret = read(fd,s,sizeof(Stu)*len);
for(i=;i<len;i++)
{
if(ret<)
{
printf("read error.\n");
goto END;
}
if(ret == )
{
printf("pipe broken.\n");
goto END;
}
if(s[i].id==)// 一旦数据读取完毕就退出
{
goto END;
}
printf("%d\t%s\n",s[i].id,s[i].name);//打印读取到的数据
}
END:
printf("read success\n");
close(fd);
return ;
}

运行结果:右边输入,左边输出

另一种FIFO(边读边写)

代码1:

 #include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h> void fun(int sig)
{
printf("中断..\n");
return;
} int main()
{
int fd;
int ret;
char buf[]; signal(SIGPIPE,fun);
//创建
ret = mkfifo("file_f",);
if(ret<)
{
if(errno != EEXIST)
{
perror("mkfifo");
return -;
}
}
printf("mkfifo success.\n"); //打开管道
printf("open ..\n");
fd = open("file_f",O_WRONLY);
printf("open fd = %d\n",fd);
if(fd<)
{
printf("open error.\n");
} //写操作
while()
{ fgets(buf,,stdin);//输入 ret = write(fd,buf,strlen(buf)+ );
if(ret<)
{
printf("write error.\n");
goto END;
}
}
printf("write success.\n"); END:
close(fd);
return ;
}

代码2:

 #include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h> int main()
{
int fd;
int ret;
char buf[]; //创建
ret = mkfifo("file_f",);
if(ret<)
{
if(errno != EEXIST)
{
perror("mkfifo");
return -;
}
}
printf("mkfifo success.\n"); //打开管道
printf("open ..\n");
fd = open("file_f",O_RDONLY);
printf("open fd = %d\n",fd);
if(fd<)
{
printf("open error.\n");
} while()
{
ret = read(fd,buf,);//读取输出
if(ret<)
{
printf("read error.\n");
goto END;
}
if(ret == )
{
printf("pipe broken.\n");
goto END;
}
printf("read buf:%s\n",buf);
}
END:
close(fd);
return ;
}

输出结果:

管道/FIFO的更多相关文章

  1. Linux学习笔记25——命名管道(FIFO)

    1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...

  2. 进程间通信系列 之 命名管道FIFO及其应用实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  3. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  4. 进程间通信___命名管道(FIFO)

    命名管道(FIFO) 基本概念 命名管道和一般的管道基本相同,但也有一些显著的不同: 命名管道是在文件系统中作为一个特殊的设备文件而存在的. 不同祖先的进程之间可以通过管道共享数据. 当共享管道的进程 ...

  5. 命名管道FIFO

    首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了. 一直在理解进程间通信的问题.发现上次忽略了一个问题 ...

  6. linux有名管道fifo,进程间通信

    命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通 ...

  7. 进程间通信IPC-命名管道FIFO

    FIFO又被称为命名管道,未命名的管道只能在两个相关的进程之间使用,而这两个相关的进程还要有一个共同创建了它们的祖先进程,但是FIFO,不相关的进程之间也能交换数据. FIFO是一种文件类型.通过st ...

  8. 有名管道FIFO

    管道和FIFO的特征之一是它们的数据是一个字节流.这是UNIX的原生I/O模型.进程往其中写入的是字节流,系统不对它作解释. FIFO不存数据,只是通过它找到内核文件. 一.建立有名管道 1.命令mk ...

  9. 命名管道FIFO和mkfifo函数

    进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...

随机推荐

  1. pip升级后出现cannot import name 'main'

    运行pip install  --upgrade pip还有出现这个情况. cd /usr/bin/pip3 修改成: from pip import __main__ if __name__ == ...

  2. 词根:sol = sun(太阳) 词根:sol = alone/single, whole/entire (单独的)

    词根:sol = sun(太阳) sol 这个词根有的书上如刘毅字典,刘洪波英文字根词源精讲等上面说来自拉丁语的sol(=sun),有的书如赢在单词上面说sol 来自拉丁语的solari,但不管哪种说 ...

  3. [ArcGIS]ArcGIS Server环境搭建,发布服务,以及使用ArcGIS API for JavaScript

    环境搭建 安装Web服务器 IIS 控制面板-程序-程序和功能-启用或关闭Windows功能,勾选以下 安装VisualStudio,选择包括ASP.NET模块 安装ArcGIS服务器 ArcGIS ...

  4. Spring常用注解总结(3)

    @Configuration 表示该类为"配置类",可替换xml配置文件.与@Component不同的是,@Configuration会生成CGLIB代理class. @Targe ...

  5. 从xampp到phpmyadmin

    目录 xampp的安装和配置 尝试运行Example11_1(图形化管理工具的可视化界面) 参考博文 xampp的安装和配置 主要参考博文Intellj IDEA 简易教程 1.下载并安装xampp ...

  6. URL安全的Base64编码,解码

    Base64 可以将二进制转码成可见字符方便进行http传输,但是base64转码时会生成“+”,“/”,“=”这些被URL进行转码的特殊字符,导致两方面数据不一致. 我们可以在发送前将“+”,“/” ...

  7. 201621123002《Java程序设计》第十周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

  8. java学习(二)

    学号 20189214 <Java程序设计>第二周学习总结 教材学习内容总结 java类 创建java对象需要类似的模板,即类(class) java对象也拥有属性和能够执行的动作. 属性 ...

  9. EF + mysql 异常:Unable to load the specified metadata resource

    数据库连接字符串报错, <add name="xxxx" providerName="MySql.Data.MySqlClient" connection ...

  10. VUE 组件通信、传值

    一.通过路由进行带参传值: 两个组件A和B,A组件通过query把orderId传递给B组件(触发事件可以是点击事件.钩子函数等) this.$router.push({path:'/componen ...