基础知识:

管道是最初的Unix IPC形式,可追溯到1973年的Unix第3版。使用其应注意两点:

1)没有名字;

2)用于共同祖先间的进程通信;

3)读写操作用read和write函数

#include <unistd.h>
int pipe(int
fildes[2]);

返回:成功返回1,否则返回-1.创建成功的两个文件描述符:f[0]和f[1],前者用来打开读,后者用来打开写。 #include <unistd.h>
ssize_t read(int fildes, void *buf, size_t nbyte);
ssize_t write(int fildes, const void *buf, size_t nbyte);

测试代码:

代码1

 #include<stdio.h>
#include<unistd.h> int main()
{
int n,fd[]; // 这里的fd是文件描述符的数组,用于创建管道做准备的
pid_t pid;
char line[];
if(pipe(fd)<) // 创建管道
printf("pipe create error/n"); if((pid=fork())<) //利用fork()创建新进程
printf("fork error/n");
else if(pid>)
{ //这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world"
close(fd[]);
write(fd[],"hello word/n",);
}
else
{ //这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据
close(fd[]);
n= read(fd[],line,);
write(STDOUT_FILENO,line,n);
}
exit();
}

代码2

 #include <unistd.h>
#include <stdio.h> void client (int, int ) , 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 () ;
}
/* parent */
close (pipe1[]) ;
close (pipe2[]) ;
client (pipe2[], pipe1[]) ; waitpid(childpid, NULL, ); /* wait for child to terminate */
exit() ; } void client(int readfd, int writefd)
{
size_t len;
ssize_t n;
char buff[MAXLINEI; /* read pathname */
fgets (buff, MAXLINE, stdin) ;
len = strlen(buf f) ; /* £gets() guarantees null byte at end */
if (buff [len - ] == '\n' )
len--; /* delete newline from £gets() */ /* write pathname to IPC channel */
write(writefd, buff, len); /* read from IPC, write to standard output */
while ( (n = Read(readfd, buff, MAXLINE)) > )
write(STD0UT_FILENO, buff, n):
}
void server(int readfd, int writefd)
{
int fd;
ssize_t n;
char buff [MAXLINE + ]; /* read 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)) < )
{
/* error: must tell client */
snprintf(buff + n, sizeof(buff) - n, ": can't open, %s\",strerror(errn0));
n = strlen(buf f) ;
write(writefd, buff, n) ;
}
else
{
/* open succeeded: copy file to IPC channel */
while ( (n = Read(fd, buff, MAXLINE)) > )
write(writefd, buff, n);
close ( fd) ;
} }

参考资料

win32下的多线程命名管道通信的设计

linux管道

pipe fifo简介

Linux进程线程学习笔记:进程间通信之管道

Linux进程间通信IPC学习笔记之管道的更多相关文章

  1. Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)

    Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)

  2. Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

    Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

  3. Linux进程间通信IPC学习笔记之消息队列(SVR4)

    Linux进程间通信IPC学习笔记之消息队列(SVR4)

  4. Linux进程间通信IPC学习笔记之有名管道

    基础知识: 有名管道,FIFO先进先出,它是一个单向(半双工)的数据流,不同于管道的是:是最初的Unix IPC形式,可追溯到1973年的Unix第3版.使用其应注意两点: 1)有一个与路径名关联的名 ...

  5. Linux进程间通信IPC学习笔记

    linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...

  6. Linux进程间通信IPC学习笔记之同步一(线程、互斥锁和条件变量)

    基础知识: 测试代码: 参考资料: Posix 多线程程序设计

  7. Linux进程间通信IPC学习笔记之消息队列(Posix)

    基础知识: 消息队列可认为是一个消息链表,有足够写权限的线程可往队列中放置消息,有足够读权限的线程可以从队列中取走消息.在某个进程往一人队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达. ...

  8. linux的IPC进程通信方式-匿名管道(一)

    linux的IPC进程通信-匿名管道 什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管道的真正定义是 ...

  9. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

随机推荐

  1. VMware系统运维(三 )SQL Server 2008 R2安装

    1. 点击"全新SQL Server 独立安装或向现有安装添加功能" 2.验证通过,点击确定. 3.输入数据库密钥,必须支持正版,不然微软打你屁屁,嘻嘻 4.不接受不让你过,所以不 ...

  2. CF A and B and Chess

    A and B and Chess time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  3. [改善Java代码]建议40:匿名类的构造函数很特殊

    建议40: 匿名类的构造函数很特殊 在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行 ...

  4. AutoHotKey 脚本集中营(一)

    前言:实战是最好的学习.本集中营共分 x+mc2 期(x 为已发行的期数,m 为我的空闲时间,c 为我的更新动力),旨在通过对脚本代码的阅读而提高 AHK 语言的熟练程度.脚本的难度与期数成正比,有兴 ...

  5. StringBuilder 类

    表示可变字符字符串.无法继承此类. 此类表示值为可变字符序列的类似字符串的对象.之所以说值是可变的,是因为在通过追加.移除.替换或插入字符而创建它后可以对它进行修改.有关比较,请参见 String 类 ...

  6. Java Concurrency - 线程的基础操作

    创建线程 在 Java 中,创建线程有两种方式: 继承 java.lang.Thread 类,重写 run 方法. public class MyJob extends Thread { @Overr ...

  7. Nginx - HTTP Configuration, Module Variables

    The HTTP Core module introduces a large set of variables that you can use within the value of direct ...

  8. Android第三方授权(QQ篇)

    QQ授权比微信授权相对来说会方便一些 同样需要去官网下载sdk和导入sdk到自己的工程 http://wiki.connect.qq.com/%E7%A7%BB%E5%8A%A8%E5%BA%94%E ...

  9. XCode中的特殊快捷键图标

    ⌘——Command () ⌃ ——Control ⌥——Option (alt) ⇧——Shift ⇪——Caps Lock fn——功能键就是fn

  10. Tab 防刷新

    今天发现项目中有个小毛病,就是tab老是刷新,就上网Copy了一份防止刷新的Tab例子,谢咯. 贴上来参考一下: <!DOCTYPE html PUBLIC "-//W3C//DTD ...