单一进程使用管道基本上毫无意义。管道一般用来子进程和父进程之间的通信,或者兄弟进程间的通信。

  创建管道的主要函数是pipe

#include<unistd.h>
int pipe (int filedes[])

  pipe函数创建一个管道,为管道的两端设置文件描述符。我们通过文件描述符进行读写。写入端的文件描述符存放在filedes[0]中,读出端则在filedes[1]中。(在linux中文件描述符0为标准输入,1为标准输出)

  成功返回0,失败返回-1(并设置errno)

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h> //定义两个管道读写函数
void read_pipe (int file)
{
FILE *stream;
int c;
stream = fdopen (file, "r");
while ((c = fgetc (stream)) != EOF)
putchar (c);
fclose (stream);
} void write_pipe (int file)
{
FILE *stream;
stream = fdopen (file, "w");
fptintf (stream, "hello, world!\n");
fprintf (stream, "goodbye, world!\n");
fclose (stream);
} int main (void)
{
pid_t pid;
int filedes[]; //创建管道
if (pipe (mypipe))
{
fprintf(stderr, "Pipe failed. \n");
return EXIT_FAILURE;
} //创建子进程
pid = fork();
if (pid == (pid_t))
{//子进程开始读管道,读的时候需要先关闭输入端口
close (filedes[]);
read_pipe(filedes[]);
return EXIT_SUCCESS;
} else if (pid < (pid_t) )
{//fork失败,
fprintf (stderr, "Fork failed.\n");
return EXIT_FAILURE;
} else
{//父进程开始写管道,先关闭读出端;
close (filedes[]);
write_pipe(filedes[]);
return EXIT_SUCCESS;
}
}

   还有一种关于匿名管道的函数popen,同样是传递消息给子进程的,不同的是子进程是command参数指定linux 命令(可执行程序, 由exec执行)

#include <stdio.h>
FILE *popen (const char *command, const char *mode)

   mode参数指定了管道的模式,可以是"r" (以读的方式打开管道)、"w"(以写的方式打开管道)。和文件读写一样。

  与之配套的函数pclose用来关闭管道

#include <stdio.h>
int pclose (FILE *stream)

简单代码示例

#include<stdio.h>
int main()
{
FILE *output = popen ("more", "w");
for (i = ; i < ; i++)
fprintf(output, "received form main process %d\n", i);
pclose (output);
}

  以上管道都是匿名的(只能在子进程和父进程,或者兄弟进程之间使用)。我们可以给管道起个名字,这样任意有权限的进程都可以使用。这样的管道被称为FIFO Special Files。但是FIFO的两端的进程读写必须同时就位后,才可以传送消息。否则其中一端会被阻塞(可以设置一个缓冲区,用来接收写入的消息,这样就可以异步通信了)

#include<sys/stat.h>
int mkfifo (const char *filename, mode_t mode)

filename参数用来设置FIFO名字,mode用来设置读写权限。

  在管道中传输的数据如果比较大,会分次传输。    

linux C 管道的更多相关文章

  1. linux 有名管道(FIFO)

    http://blog.csdn.net/firefoxbug/article/details/8137762 linux 有名管道(FIFO) 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时 ...

  2. Linux的管道命令

    Linux的管道命令 管道命令(Pipe) 管道命令用"|"来表示,管道命令需要接收前一个命令的输出来进行操作,但不能处理前一个命令的错误. //选取界面:cut,grep cut ...

  3. Linux进程间通信—管道

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

  4. Linux有名管道的 阻塞VS非阻塞 读写

    参考文章: 关于有名管道open时阻塞的问题 Linux有名管道(FIFO)的阻塞和非阻塞读写 挖坑,日后填

  5. linux保持管道中颜色显示

    在linux工作中,不同类型的文件以不同的颜色显示,如文件夹显示蓝色,压缩文件显示橘黄色,可执行文件显示为绿色,链接失效文件高亮显示等等: 有时候根据颜色可以快速鉴别,如我有时为了保持目录的完整性,会 ...

  6. linux有名管道fifo,进程间通信

    命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通 ...

  7. Linux用管道命令对文件的移动

    我的问题是这样的:我有一个文件夹,里面有大约有1000个文件,然后我想把这样的一部分文件给随机分成两部分,一部分含有100张,另外一部分含有剩下的所有的文件,这个时候如果是在Linux图形界面的话直接 ...

  8. Linux进程间通信 -- 管道(pipe)

    前言    进程是一个独立的资源管理单元,不同进程间的资源是独立的,不能在一个进程中访问另一个进程的用户空间和内存空间.但是,进程不是孤立的,不同进程之间需要信息的交互和状态的传递,因此需要进程间数据 ...

  9. Linux下管道重定向使用以及Shell编程(操作系统)

    实验名称:Linux的基本操作 实验目的: 1.了解管道和重定向 2.熟悉基本的Linux脚本的编写 实验环境:Ubuntu 12.4(32位,简体中文) 实验内容: 1.将当前用户目录下的文件清单输 ...

随机推荐

  1. C++编译错误syntax error : identifier 'THIS_FILE' 解决方法

    你到代码里搜索 THIS_FILE看是不是它定义在别的头文件前面了,如果是,把它们的头文件紧跟到Stdafx.h后面 我遇到过这问题,这样搞定的 今天遇到个编译错误:..\vc98\include\n ...

  2. 怎样用CODESOFT打印连续的条码标签?

    在实际工作中,经常会用CODESOFT条 码打印软件来实现打印连续的条码标签,将这些标签按递增或递减等方式连续打印.这样设置可大大提高用户的工作效率.实现在CODESOFT 2015打印连续条码标签, ...

  3. 百度地图API 学习网站

    官方示例:http://developer.baidu.com/map/jsdemo.htm#a1_2 (注意:此网页可能由于浏览器问题,源代码编辑器中的代码不能看到.火狐亲测有效) http://d ...

  4. 使用Flex4的PopUpManager的addPopUp() 方法弹出 removeChild异常的解决办法

    Flex4中,弹出窗口有两种: Alert.show("balabalabala-");   PopUpManager.addPopUp([要弹出的控件],[父控件],[是否模态] ...

  5. Eclipse中Jsp页面警告的解决方法小结

    恩,只要是开发人员,这样的小事情总会遇到的,对于这其中的某些警告性的错误是不影响代码的运行的,对应的功能也是能实现的,不过总给人一种不太好看的感觉!如果代码写的比较符合规范,这些问题也就自然而然的消失 ...

  6. 在yii中使用gearman

    最近项目需要将利用gearman进行任务调度,目前所用框架为yii,在部署好gearman后,试图在yii中调用gearman,一直报错: 提示reverse函数没有定义,明明已经定义了啊!可能是当时 ...

  7. STM32F05 学习中............

    今天,拿到stm32f05的板子已经三个月了吧,但是没有真的研究过,真的对板子过意不去了...所以决定今天好好的对待我的板子.

  8. WWF3入门<第一篇>

    工作流是什么东西?暂时还不是很弄得清除. 工作流是用来解决什么问题的?暂时只是形成了一个很模糊的概念,还没办法用语言描述出来. 一.入门范例 以VS2008为例,先来创建一个WWF程序. 在工具箱中, ...

  9. leetcode 9

    判断一个数是否为回文数,不利用额外的空间. 思路:将数反转后进行比较. 注意:反转之后数越界的判断,若越界,则不是回文数:负数不是回文数: 代码如下: class Solution { public: ...

  10. hdu1150

    [ Reprinted ]最小点覆盖=最大二分匹配数 url: http://zhidao.baidu.com/link?url=ZMzk27V8P99KQN63DpVsE2fd1YBIk7Jg83E ...