相关介绍
分配一块独立于进程的内存,对内存的操作方式和对文件的操作方式类似。有如下特点:
1 只能用于父子进程之间。
2 管道的大小是有限制(一个页面的大小,4K字节)。
3 数据是单向流动的。
4 传送的是无格式字节流,需要双方事先确定好长度 格式等。
操作函数
1 创建一个管道
#include <unistd.h> int pipe( int fildes[2] ); //出参,用于管道读写端的文件描述符; 返回值:0(成功)/-1(失败,错误信息在errno中)
2 读管道
#include <unistd.h> ssize_t read( int fildes, //入参,读端的文件描述符,fildes[0] void* buf, //buf:出参,从管道读取的数据 size_t nbyte ); //nbyte:入参,从管道读取的数据的额长度 返回值:>= 0 从管道中读取的数据的长度 = -1 出错,错误信息在errno中
3 写管道
#include <unistd.h> ssize_t write( int fildes, //入参,写端的文件描述符,fildes[1] void* buf, //buf:入参,需要写入管道的数据 size_t nbyte ); //nbyte:入参,需要写入管带的数据的额长度 返回值:>= 0 写入管道的数据的长度 = -1 出错,错误信息在errno中
使用实例
/************************************************************************* > File Name: testpipe.c > Author: qiaozp > Mail: [email protected] > Created Time: 2014-9-15 11:03:08 > Step: 1 调用pipe函数在内核中创建一块存储区, 存储区有一个读端(fildes[0]) 和 写端(fildes[1]) 2 调用fork函数创建子进程 3 子进程负责写,关闭读端,写数据 4 父进程负责读,关闭写端,读数据 ************************************************************************/ #include <errno.h> #include <iostream> #include <unistd.h> using namespace std; int main() { char buff[100] = {0}; int pipeFd[2]; //create pipe if (pipe(pipeFd) == -1) { cout << "pipe error." << endl; return -1; } int desPid = fork(); if (desPid == 0) { cout << "son process for writing..." << endl; memset(buff, 0, sizeof(buff)); strcat(buff, "hello"); //close read, and write. close(pipeFd[0]); if (write(pipeFd[1], buff, sizeof(buff)) == -1) { cout << "son process failed to write pipe, errno is [" << errno << "]." << endl; } cout << "write data is : " << buff << endl; return 0; } else if (desPid > 0) { cout << "parent process for reading..." << endl; memset(buff, 0, sizeof(buff)); //close write and read. close(pipeFd[1]); if (read(pipeFd[0], buff, sizeof(buff)) == -1) { cout << "parent process failed to read pipe, errno is [" << errno << "]." << endl; } cout << "read data is : " << buff << endl; return 0; } else { cout << "failed to create child process, please check. errno is [" << errno << "]." << endl; return -1; } return 0; }
时间: 2024-11-16 03:37:39