Linux C编程 - 管道pipe

原创 2007年10月14日 11:09:00
 在linux中,管道也是一种文件,只不过比较特殊,我们可以用pipe函数创建一个管道,其原型声明如下:

#inlcude <unistd.h>

int pipe(int fields[2]);


其实它相当于一个通信缓冲区,fields[0]用来读,fields[1]用来写。下面的例子中,创建一个管道作为通信缓冲区,父进程创建了一个子进程,子进程通过管道的fields[1]描述符想管道中写入一个字符串,而父进程则利用管道的fields[0] 从管道中读取这个字串并显示出来:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

#define BUF_SIZ    255     // message buffer size

int main(int argc, char **argv)
{
    char buffer[BUF_SIZ + 1];
    int fd[2];

// receive a string as parameter
    if ( argc != 2)
    {
        fprintf(stderr, "Usage: %s string/n/a", argv[0]);
        exit(1);
    }

// create pipe for communication
    if ( pipe(fd) != 0 )
    {
        fprintf(stderr, "Create pipe error: %s/n/a", strerror(errno));
        exit(1);
    }

    if ( fork() == 0 )     // in child process write msg to pipe
    {
        close(fd[0]);
        printf("Child %ld write to pipe/n/a", getpid());
        snprintf(buffer, BUF_SIZ, "%s", argv[1]);
        write(fd[1], buffer, strlen(buffer));
        printf("Child %ld quit./n/a", getpid());
    }
    else     // in parent process, read msg from pipe
    {
        close(fd[1]);
        printf("Parent %ld read from pipe/n/a", getpid());
        memset(buffer, '/0', BUF_SIZ + 1);
        read(fd[0], buffer, BUF_SIZ);
        printf("Parent %ld read : /n%s/n", getpid(), buffer);
        exit(1);
    }
    return 0;
}

linux下面的pipe命令

pipe命令在linux shell中是很重要的概念管道pipe,意思是上一次命令的输出是下一个命令的输入,但是,我们知道,一个命令的输出,是没有固定格式的如ls -l一样,输出的是大段大大段的数据,...
  • turkeyzhou
  • turkeyzhou
  • 2008-05-09 10:51:00
  • 4474

multi-reactor服务器模型的C++封装类(libevent+多线程实现)

最近在看memcached的源码,觉得它那种libevent+多线程的服务器模型(multi-reactor)真的很不错,我将这个模型封装成一个C++类,根据我的简单测试,这个模型的效率真的很不错,欢...
  • flyingleo1981
  • flyingleo1981
  • 2016-07-08 17:41:22
  • 2166

linux系统编程——管道pipe

管道pipe 内核中的缓冲区,多数使用队列(数据结构)来实现的。而队列多采用环形队列,一般采用阻塞机制,还有另一种机制是覆盖机制(当队列满的时候,后入队的覆盖之前的数据)。   下边例1 完成的...
  • jobbofhe
  • jobbofhe
  • 2016-08-10 23:14:16
  • 1269

Linux管道pipe -- C和Python两种实现方案解析

一:什么是管道 管道是Linux 支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具...
  • FreeeLinux
  • FreeeLinux
  • 2016-09-19 20:22:46
  • 1259

linux

Please enable JavaScript to view the comments powered by Disqus. Please enable JavaScript to view t...
  • maimang1001
  • maimang1001
  • 2014-06-26 22:01:14
  • 27693

multi-reactor服务器模型的C++封装类(libevent+多线程实现)

最近在看memcached的源码,觉得它那种libevent+多线程的服务器模型(multi-reactor)真的很不错,我将这个模型封装成一个C++类,根据我的简单测试,这个模型的效率真的很不错,欢...
  • Emilio563
  • Emilio563
  • 2016-11-21 11:19:32
  • 383

linux 线程或进程之间通过管道通信(pipe)

线程间通信: #include // printf #include // exit #include // pipe #include // strlen #include // pt...
  • robertkun
  • robertkun
  • 2012-10-21 15:10:54
  • 10725

linux学习之十八---管道pipe&dup&dup2

1.管道的用法: 进程在使用fork函数创建子进程前先创建一个管道,该管道用于在父子进程间通信,然后创建子进程,之后父进程关闭管道的读端,子进程关闭管道的写端。父进程负责向管道写数据而子进程负责读数...
  • lanzhihui_10086
  • lanzhihui_10086
  • 2014-11-10 15:25:32
  • 1614

multi-thread

开了3个threads, 一个capture image, 一个处理,一个显示。可调了半天还是运行一会儿就挂掉,debug发现是显示的线程不再运行。奇怪,每个线程都有Sleep(),为何如此。更可恶的...
  • barryisme
  • barryisme
  • 2008-01-19 15:37:00
  • 68

Multi-Thread problem

Multi-Thread problem int j=0; main(){   create_thread(aa);   create_thread(bb);   printf("j=%d\...
  • sinat_15250185
  • sinat_15250185
  • 2017-09-07 20:24:53
  • 44
收藏助手
不良信息举报
您举报文章:Linux C编程 - 管道pipe
举报原因:
原因补充:

(最多只允许输入30个字)