Linux IPC(Inter-Process Communication,进程间通信)之管道学习
1.标准流管道
多进程学习中有具体介绍
2.无名管道(PIPE)
int main(){
int fds[2];
if(pipe(fds)==-1){
perror("pipe:");
return 0;
}
char buf[1024]="";
if(fork()==0){
close(fds[1]);
while(memset(buf,0,sizeof(buf))){
if(read(fds[0],buf,1024)==0){//当管道里没有数据的时候就退出
break;
}
printf("child:read:");
puts(buf);
}
exit(1);
}
else{
close(fds[0]);
// char p[1024];
// char *p="Hello world!";
while(memset(buf,0,1024),fgets(buf,1024,stdin)!=NULL)
write(fds[1],buf,1024);
close(fds[1]);
printf("parents,finish\n");
wait(NULL);//wait一定要放在close的后面,由于仅仅有先将父进程的fds[1]关掉,当子进程没有数据读的时候才会退出,否则会导致死锁
}
}
3命名管道(FIFO)
3.1创建,删除FIFO文件
#include<iostream>
using namespace std;
int main(int argc,char *argv[]){
if(mkfifo(argv[1],0666)==-1){
perror("ew");
return 0;
}
unlink(argv[1]);
}
3.2打开,关闭FIFO文件
fd_recv=open(argv[1],O_RDONLY);
fd_send=open(argv[2],O_WRONLY);
if(fd_send==-1){
perror("fd_send");
exit(1);
}
3.3读写FIFO
/*************************************************************************
> File Name: pork_send.c
> Author: yang
> Mail:826123027@qq.com
> Created Time: 2014年08月22日 星期五 19:54:08
************************************************************************/ #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<memory.h>
int main(int argc,char *argv[]){
if(mkfifo(argv[1],0666)==-1){
perror("mkfifo1");
exit(1);
}
int fd_send,fd_recv;
fd_send=open(argv[1],O_WRONLY);
fd_recv=open(argv[2],O_RDONLY);
char buf_recv[1024]="";
char buf_send[1024]="";
printf("opening!\n");
if(fork()==0){//开皮一个进程,用来接受信息
close(fd_send);
while(memset(buf_recv,0,sizeof(buf_recv)),read(fd_recv,buf_recv,1024)>0){
write(1,buf_recv,strlen(buf_recv));
}
close(fd_recv);
exit(1);
}
close(fd_recv);
while(memset(buf_send,0,sizeof(buf_send)),fgets(buf_send,1024,stdin)!=NULL){
write(fd_send,buf_send,strlen(buf_send));//用来发送信息
}
close(fd_send);
wait(NULL);
}
/*************************************************************************
> File Name: pork_recv.c
> Author: yang
> Mail:826123027@qq.com
> Created Time: 2014年08月22日 星期五 20:12:32
************************************************************************/ #include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<memory.h>
#include<stdio.h>
int main(int argc,char *argv[]){
if(mkfifo(argv[2],0666)==-1){
perror("mkfifo2");
exit(1);
}
int fd_send,fd_recv;
fd_recv=open(argv[1],O_RDONLY);//注意这里与上面程序的这个位置有所不一样
fd_send=open(argv[2],O_WRONLY);
char buf_recv[1024]="";
char buf_send[1024]="";
printf("opening!\n");
if(fork()==0){//接受信息
close(fd_send);
while(memset(buf_recv,0,sizeof(buf_recv)),read(fd_recv,buf_recv,1024)>0){
write(1,buf_recv,strlen(buf_recv));
}
close(fd_recv);
exit(1);
}
close(fd_recv);//发送信息
while(memset(buf_send,0,sizeof(buf_send)),fgets(buf_send,1024,stdin)!=NULL){
write(fd_send,buf_send,strlen(buf_send));
}
close(fd_send);
wait(NULL);
}
Linux IPC(Inter-Process Communication,进程间通信)之管道学习的更多相关文章
- Linux进程间通信之管道
1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...
- linux内核剖析(八)进程间通信之-管道
管道 管道是一种两个进程间进行单向通信的机制. 因为管道传递数据的单向性,管道又称为半双工管道. 管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: ...
- Linux进程间通信(一) - 管道
管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道. 例如:ps | grep vsftpd .管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准 ...
- linux IPC总结——管道
管道 管道是unix ipc的最古老形式,是一种在内存中的特殊文件,只能在具有公共祖先的进程之间使用(即父子进程,兄弟进程). 管道由pipe函数创建 #include <unistd.h> ...
- 【IPC第二个进程间通信】管道Pipe
IPC进程间通信+管道Pipe IPC(Inter-Process Communication,进程间通信). 管道用于进程间共享数据,事实上质是共享内存 ...
- Linux - 进程间通信 - 匿名管道
一.概念:进程间通信( IPC,InterProcess Communication) 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进城之间要交换数据必须通过内 ...
- Linux 进程间通信之管道(pipe),(fifo)
无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int f ...
- IPC 进程间通信方式——管道
进程间通信概述 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. 通知时间: ...
- Linux IPC实践(1) -- 概述
进程的同步与互斥 进程同步: 多个进程需要相互配合共同完成一项任务. 进程互斥: 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;系统中某些 ...
随机推荐
- winzip15.0许可证
username:Juzhaofeng 授权码:MPZRP-Y7LWW-K1DKG-FM92E-2C5F5-ZEKFF
- 掌握Java字节码(转)
Java是一门设计为运行于虚拟机之上的编程语言,因此它需要一次编译,处处运行(当然也是一次编写,处处测试).因此,安装到你系统上的JVM是原生的程序,而运行在它之上的代码是平台无关的.Java字节码就 ...
- Gradle 多渠道打包的使用和错误分析(转)
刚接触到android的开发,对什么都陌生的,本文是自己在项目中使用的技术要点总结,大咖遇到可直接飘过..... 1.Gradle 打包(不废话了直接来脚本),将下列脚本放到build.gradle文 ...
- POJ 3684 Priest John's Busiest Day 2-SAT+输出路径
强连通算法推断是否满足2-sat,然后反向建图,拓扑排序+染色. 一种选择是从 起点開始,还有一种是终点-持续时间那个点 開始. 若2个婚礼的某2种时间线段相交,则有矛盾,建边. easy出错的地方就 ...
- C++笔试面试总结
手游广州某公司书面今天接受采访时.刚进去中午1中场休息.他们公司谁刚刚醒来,一个冷漠打牌,然后去上班.瞬间,这些公司有没有什么好印象,压抑. 接着快2点的时候.发了一份笔试题.大部分题目均在网上的&l ...
- (转)mvn clean install 与 mvn install 的区别(为啥用clean)
之前写代码的过程中曾经遇到过问题,用mvn install后,新改的内容不生效,一定要后来使用mvn clean install 才生效,由于之前没有做记录,以及记不清是什么情况下才会出现的问题,于是 ...
- Xcode 凝视代码
#pragma mark ---------------凝视信息-------------------- -(void)RequestSP { // MARK: 凝视信息 // TODO: 凝视信息 ...
- Directx11学习笔记【五】 基本的数学知识----向量篇
本文参考dx11龙书 Chapter1 vector algebra(向量代数) 要想学好游戏编程,扎实的数学知识是尤为重要的,下面将对dx11龙书中有关向量的数学知识做一下总结. 在数学中,几何向量 ...
- decimal ? 含义
例如: decimal ? je = zfje; 意思是 将 JE赋值为 ZFJE , 并且允许 JE 为 NULL 值 这时JE为引用类型
- RichTextBox 右键显示 ContextMenuTrip
说明: (1)命名: RichTextBox -> rtxt1 ContextMenuTrip -> cms1 (2)截图: (3)完整代码: <span style=" ...