pipe创建函数:

#include <unistd.h>

/* Create a one-way communication channel (pipe).
If successful, two file descriptors are stored in PIPEDES;
bytes written on PIPEDES[1] can be read from PIPEDES[0].
Returns 0 if successful, -1 if not. */
int pipe (int __pipedes[]);

下面是一个测试实例,有些未说明函数,如Pipe,是pipe的一个包裹函数,二者参数及用法一致,仅仅是在包裹函数中添加了出错信息。

void client(int, int);
void server(int, int); int
main(int argc, char **argv)
{
int pipe1[], pipe2[];
pid_t childpid; Pipe(pipe1); /* create two pipes */
Pipe(pipe2); if ( (childpid = Fork()) == ) /* child */
{
Close(pipe1[]);
Close(pipe2[]); server(pipe1[], pipe2[]); // 子线程作为服务器端
exit();
}
/* 4parent */
Close(pipe1[]);
Close(pipe2[]); client(pipe2[], pipe1[]); Waitpid(childpid, NULL, ); /* wait for child to terminate */
exit();
}
/**
* 从客户端读取文件名,打开文件并将文件内容返回给客户端
* @param readfd 管道读描述符
* @param writefd 管道写描述符
*/
void server(int readfd, int writefd)
{
int fd;
ssize_t n;
char buff[MAXLINE + ]; /* 4read pathname from IPC channel */
if ( (n = Read(readfd, buff, MAXLINE)) == )
err_quit("end-of-file while reading pathname"); buff[n] = '\0'; /* null terminate pathname */ if ( (fd = open(buff, O_RDONLY)) < )
{
/* 4error: must tell client */
// 打开失败则直接将错误信息写入管道
snprintf(buff + n, sizeof(buff) - n, ": can't open, %s\n", strerror(errno));
n = strlen(buff);
Write(writefd, buff, n); }
else
{
/* 4open succeeded: copy file to IPC channel */
while ( (n = Read(fd, buff, MAXLINE)) > )
Write(writefd, buff, n);
Close(fd);
}
} /**
* 将键盘输入数据发送给服务器,并将服务器的回复信息显示在屏幕
* @param readfd 管道读描述符
* @param writefd 管道写描述符
*/
void client(int readfd, int writefd)
{
size_t len;
ssize_t n;
char buff[MAXLINE]; /* 4read pathname */
Fgets(buff, MAXLINE, stdin); // 从键盘获取输入信息
len = strlen(buff); /* fgets() guarantees null byte at end */
if (buff[len - ] == '\n')
len--; /* delete newline from fgets() */ /* 4write pathname to IPC channel */
Write(writefd, buff, len); // 写入管道 /* 4read from IPC, write to standard output */
while ( (n = Read(readfd, buff, MAXLINE)) > )
Write(STDOUT_FILENO, buff, n);
}

以上测试实例实现了一个如下的客户-服务器:

Unix IPC之pipe的更多相关文章

  1. 进程通信类型 管道是Linux支持的最初Unix IPC形式之一

    管道 Linux环境进程间通信(一) https://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html 管道及有名管道 郑彦兴200 ...

  2. Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道

    Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...

  3. Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号

    Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...

  4. 进程通信类型 管道是Linux支持的最初Unix IPC形式之一 命名管道 匿名管道

    管道 Linux环境进程间通信(一) https://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html 管道及有名管道 郑彦兴200 ...

  5. c/c++ unix ipc

    c/c++ unix ipc 一个例子 //c_unix.c #include <stdio.h> #include <sys/types.h> #include <sy ...

  6. Linux IPC BSD Pipe

    mkfifo() //创建有名管道(FIFO special file),创建完了就像普通文件一样open(),再读写,成功返回0,失败返回-1设errno.VS$man 3 mkfifo #incl ...

  7. Unix IPC之Posix消息队列(1)

    部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...

  8. UNIX IPC: POSIX 消息队列 与 信号

    POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数. 下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信) #include < ...

  9. linux IPC的PIPE

    一.PIPE(无名管道) 函数原型: #include <unistd.h> ]); 通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道. 父进程和子进程之 ...

随机推荐

  1. CentOS 7.0源码包搭建LNMP方法分享(实际环境下)

    CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14 一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这 ...

  2. 音视频处理之FFmpeg封装格式20180510

    一.FFMPEG的封装格式转换器(无编解码) 1.封装格式转换 所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件). 需要注意的 ...

  3. c++操作mysql入门详解

    首先,根据你当前的操作系统,还有开发工具,选择相应的mysql版本.本人选择的环境是win10 + vs2013 需要解决三个问题:1.下载安装mysql服务器,并登录mysql测试一下是否安装成功: ...

  4. Hadoop生态圈-Hive的自定义函数之UDTF(User-Defined Table-Generating Functions)

    Hadoop生态圈-Hive的自定义函数之UDTF(User-Defined Table-Generating Functions) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. 缓存失效策略(FIFO,LRU,LFU)

    当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: 1. FIFO:First In First Out,先进先出.判断被存储的时 ...

  6. UITableViewCell的separatorInset属性

    separatorInset这个属性是IOS7后才有的属性,所以需要判断一下,才能修改 if (IOS7_OR_LATER) { cell.separatorInset = UIEdgeInsetsZ ...

  7. jmeter乱码问题

    JMeter 的版本由 2.13 升级到了 3.0 发现之前接口脚本 POST 请求主体中的中文无法正确显示,现象如下图所示:

  8. core EFCore 开始尝试

    准备工作: 工程:core + console 引用包: Install-Package Microsoft.EntityFrameworkCore Install-Package Microsoft ...

  9. javamail模拟邮箱功能--邮件回复-中级实战篇【邮件回复方法】(javamail API电子邮件实例)

    引言: JavaMai下载地址l jar包:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

  10. Sparse AutoEncoder简介

    1. AutoEncoder AutoEncoder是一种特殊的三层神经网络, 其输出等于输入:\(y^{(i)}=x^{(i)}\), 如下图所示: 亦即AutoEncoder想学到的函数为\(f_ ...