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 Capacity、PIPE_BUF

一、当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。 O_NONBLOCK enable:read调用返回-1,errno值为EAG...
  • Simba888888
  • Simba888888
  • 2013年05月21日 09:39
  • 6434

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

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

Linux C编程--进程间通信(IPC)4--管道详解

linux管道 管道相关内容的简介 管道是单向的字节流,它将某个进程的标准输出连接到另一个进程的标准输入。管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013年03月05日 10:22
  • 7834

linux 管道读写规则

一,管道读写规则 当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。O_NONBLOCK enable:read调用返回-1,e...
  • nodeathphoenix
  • nodeathphoenix
  • 2014年04月09日 17:26
  • 10809

Linux 管道(pipe)原理及使用

简介:本文主要介绍了管道(pipe)的基本概念和用途;分析了环形缓冲区的存储、访问及其实现方法;分析并发访问可能引发的问题,并给出解决方法;分析了linux2.6.29内核中pipe的读写函数。 ...
  • jmppok
  • jmppok
  • 2013年12月20日 17:44
  • 3150

Linux进程间通信方式之管道(pipe)

每个进程各自有独立的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,但是所有进程都共享内核地址空间,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内...
  • yangwen123
  • yangwen123
  • 2013年11月04日 08:18
  • 5622

linux管道pipe详解

管道 管道的概念: 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两...
  • oguro
  • oguro
  • 2016年12月23日 17:16
  • 17716

Linux每天学习一个命令之管道命令(pipe)

之前学习命令的时候使用了管道命令,只知道如何使用,不是十分清楚其使用规则,决定学习总结一下管道的使用 什么是管道:管道就是用 | 连接两个命令,以前面一个命令的标准输出作为后面命令的标准输入...
  • zp_00000
  • zp_00000
  • 2016年04月28日 08:59
  • 2416

Linux内核中无名管道pipe和有名管道fifo的分析

1、管道(pipe) 管道是进程间通信的主要手段之一。一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端。管道是一种特殊的文件,它不属于某一...
  • omnispace
  • omnispace
  • 2016年03月20日 13:07
  • 1493

Linux系统常用指令、管道(pipe)、文件查找(find)

1.系统常用指令 grep 关键字 文件名 //将文本中含有关键字的信息匹配出来,如:grep login etc/passwd,匹配etc/passwd文件中的login which...
  • liu537192
  • liu537192
  • 2016年06月13日 16:57
  • 1870
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux C编程 - 管道pipe
举报原因:
原因补充:

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