linux进程间通讯--管道
2017-08-29 19:18
211 查看
/************************************************************************* > File Name: linux_pipe.cpp > Author: lijun > Mail: 2291042162@qq.com > Created Time: 2017年08月29日 星期二 16时03分08秒 ************************************************************************/ //对于管道 linux上常见的就是 ls -l | grep strings 这里的|就是一个管道 //通过ls -l 进程的输出输入管道然后输出给grep进程作为输入 #include<iostream> #include<unistd.h> #include<string.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> using namespace std; //匿名管道只能用在父子进程中,通过fork实现 //有两种形式 1:popen 2:pipe //其中popen 基于文件流 其实就是和fopen函数一样 而且读取用的也是fread fwrite //pipe则是通过文件描述符(两个 0表示只读 1表示只写) 而且读取方式为read write void test_AnonymousPipe() { char * strTest = "hello AnonymousPipe"; int iFileDes[2]={0}; pid_t pid; if(pipe(iFileDes)==0) { pid = fork(); if(pid ==-1)// { printf("fork failed"); } else if(pid == 0)//子进程 { const int ciBufLen = 64; char cBuffer[ciBufLen]={0}; read(iFileDes[0],cBuffer,ciBufLen); printf("the child process received :%s\n",cBuffer); exit(0); } else//父进程 { write(iFileDes[1],strTest,strlen(strTest)); printf("the parent process send :%s\n",strTest); sleep(2); } } } //命名管道则可以用在不同本机进程中,但是为了方便演示,本例依然采用父子进程 //命名管道使用mkfifo创建一个管道(仅仅是创建) //命名管道也是采用open 的方式打开一个管道 然后依然是read write 进行读写 //看上去跟匿名管道的popen 很像 void test_NamePipe() { const char * chFifoName = "/tmp/test_NamePipe"; const char * strTest = "hello NamePipe"; int iPipeId = -1; if(access(chFifoName,F_OK) == -1) { int res = mkfifo(chFifoName,0777); if(res != 0) { printf("create fifo failed\n"); return; } } pid_t pid = fork(); if(pid == -1) { printf("fork failed\n"); } else if(pid == 0) { const int ciBufLen = 64; char chBuffer[ciBufLen]={0}; iPipeId = open(chFifoName,O_RDONLY); read(iPipeId,chBuffer,ciBufLen); printf("the child process received :%s\n",chBuffer); close(iPipeId); exit(0); } else { iPipeId = open(chFifoName,O_WRONLY); write(iPipeId,strTest,strlen(strTest)); printf("the parent process send :%s\n",strTest); sleep(2); close(iPipeId); } } int main() { test_AnonymousPipe(); test_NamePipe(); return 0; }
相关文章推荐
- Linux下用fork()派生的子进程通过pipe管道通讯的实例详解("生产者-消费者"问题)
- linux 进程间管道通讯 popen以及pclose
- linux进程间通讯-匿名管道
- Linux 进程间通讯之创建无名管道和读写无名管道
- 神奇的linux:父子进程管道通讯
- Linux 进程间通讯之有名管道方式
- Linux笔记_进程通讯——管道
- Linux进程通讯:管道通讯、信号通讯、共享内存
- Linux 进程间通讯之有名管道方式
- 【Linux】利用管道在进程通讯拷贝文件
- Linux进程间通讯--管道(有名管道
- Linux中进程通讯--无名管道
- Linux进程间通讯方式之管道pipe
- Linux 进程间通讯之创建无名管道和读写无名管道
- Linux下进程的创建及其使用管道进行进程之间的通讯[00原创]
- Linux-进程间通讯-管道
- linux_c开发(5-2)进程间通讯_管道通讯
- linux进程间通讯-命名管道
- Linux进程间通讯一--无名管道PIPE
- Linux 进程间通讯方式 pipe()函数