管道通信

管道大致分为两种:

1.匿名管道:这个一般只能用于父进程创建管道传递给子进程,可以父子进程通信

2.有名管道:这种管道存在于文件系统中,所以任意进程都能找到,都可以通过它来通信

API:

#include <unistd.h>

int pipe(int fds[2])

fds[0] 是读取文件描述符,也就是管道出口

fds[1] 是写文件描述符,也就是管道入口

创建一个匿名管道

成功返回0,失败返回-1

int dup(int oldfd);创建文件描述符的副本

int dup2(int oldfd,int target)让target 也指向该文件

/*************************************************************************
	> File Name: pipe_simple.c
	> Author: nealgavin
	> Mail: [email protected]
	> Created Time: Tue 03 Jun 2014 10:02:14 AM CST
 ************************************************************************/

#include<stdio.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <wait.h>

#define MAX_LINE 80
#define PIPE_STDIN 0
#define PIPE_STDOUT 1

int main()
{
    const char*str = "A simple message !";

    int ret,myPipe[2];
    char buffer[ MAX_LINE+1 ];

    //create pipe
    ret = pipe( myPipe );

    if (ret == 0)
    {
        if(fork() == 0)
        {
            puts("child first");
            ret = read( myPipe[ PIPE_STDIN ],buffer,MAX_LINE );
            buffer[ ret ] = 0;
            printf( "child read %s\n",buffer );
        }
        else{
            puts("father");
            ret = write( myPipe[ PIPE_STDOUT ],str,strlen(str) );
            ret = wait(NULL);
        }
    }
    return 0;
}

/*************************************************************************
	> File Name: pipe_execlp.c
	> Author: nealgavin
	> Mail: [email protected]
	> Created Time: Tue 03 Jun 2014 10:52:18 AM CST
 ************************************************************************/

#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int pfds[2];
    char ccc;
    if( pipe(pfds) == 0 ) {
        if(fork() == 0){
            close(0);
            dup2(pfds[1],1);
            close(pfds[0]);
            execlp("ls","ls","-a","-l",NULL);
        }
        else{
            close(0);
            dup2(pfds[0],0);
            close(pfds[1]);
            /*
            while(ccc=getchar())
            {
                if(ccc == EOF)
                    break;
                putchar(ccc);
            }*/
            execlp("wc","wc","-l",NULL);
        }
    }
    return 0;
}

2.有名管道:

#include<sys/types.h>

#include<sys/stat.h>

int mkfifo(const char*pathname,mode_t mode)

要创建的管道文件名,权限

命名管道,除非有一个写入者已经打开命名管道,否则读取者不能打开命名管道。

/*************************************************************************
	> File Name: pipe_mkfifo.c
	> Author: nealgavin
	> Mail: [email protected]
	> Created Time: Tue 03 Jun 2014 11:16:14 AM CST
 ************************************************************************/

#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int ret;
    FILE* pfp=NULL;
    const char*path = "pipe_data";
    char s[1024];
    ret = mkfifo(path,S_IFIFO | 0666);
    printf("ret = %d\n",ret);
    if( ret == 0 )
    {
        if(fork() == 0)
        {
            pfp = fopen(path,"w+");
            puts("child fork datain");
            while(~scanf("%s",s))
            {
                if(s[0] == '#')
                    break;
                fprintf(pfp,"%s",s);
            }
        }
        else
        {
            pfp = fopen(path,"r");
            if(pfp != NULL)
            {
                fgets(s,1023,pfp);
                printf("father:pipe out %s\n",s);
            }
        }
    }
    return 0;
}

管道通信,布布扣,bubuko.com

时间: 2024-10-13 23:31:57

管道通信的相关文章

C#命名管道通信

原文:C#命名管道通信 C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI.发消息等.但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用.RMI又用的太多了,准备用管道通信来做消息通信. 管道通信以前在大学学过,包括匿名管道和命名管道.匿名管道只能用在父子进程之间:命名管道可以用在两个进程甚至跨服务器通信.这里给出命名管道的示例. 服务器端代码 private static void WaitData() { using (NamedPipe

管道通信之无名管道---pipe()

pipe()函数在子进程产生之前就应该存在. 父子进程之间只进行一次传递 1 /*============================================ 2 > Copyright (C) 2014 All rights reserved. 3 > FileName:onepipe.c 4 > author:donald 5 > details: 6 ==============================================*/ 7 #inclu

管道通信,王明学learn

管道通信 一.通讯目的 1.数据传输 一个进程需要将数据发送给另一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个/组进程发送消息,通知它们发生了某事件. 4.进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变. 二.通讯发展 Linux进程间通信(IPC:interprocesscommunication)由以下几部分发展而来: 1.UNIX进程间通信 2.基于Sy

PHP多进程编程(2):管道通信

一个进程如果是个人英雄主义,那么多进程就是集体主义.(不严格区分多进程 和 多线程的差别) 你不再是一个独行侠,而是一个指挥家. 独来独往,非常自由自在,但是,很多时候,不如众人拾柴火焰高. 这就是我对多进程的理解.多线程编程的主要问题是:通信 和 同步问题. 更多PHP 多线程编程的背景知识见: PHP多进程编程(一) 在PHP 中,如果光用pcntl ,实现比较简单的通信问题都是很困难的. 下面介绍管道通信: 1. 管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西.

python Subprocess执行系统命令管道、读取结果【多进程,进程间管道通信】

# -*- coding:utf-8 -*- __author__ = 'magicpwn' import subprocess import sys reload(sys) sys.setdefaultencoding('utf-8') # 执行命令的两个函数,新建进程执行系统命令 s = subprocess.check_call('dir', shell=True) p = subprocess.call('dir', shell=True) print s, p # 执行命令并捕获系统命

管道通信初级

1. pipe管道通信,其实socket也要依赖于它,可以实现双向通信.还能解决并发.比共享内存和邮槽都靠谱.2. 禁止一个程序打开多次,也就是锁定一个程序只能打开一次,限制它的打开次数,用管道就   必须这么做,否则会发生冲突.3.有线程池也有管道池 4.例子 服务端 #include <stdio.h> #include <Windows.h> //管道是存在于操作系统 #define SIZE 4096 char pipename[128] = "\\\\.\\Pi

Linux学习记录--命名管道通信

命名管道通信 什么是命名管道 一个主要的限制是,它是匿名管道的应用还没有名字,因此,只有它可以用于进程间通信的方式与亲缘关系.在命名管道(named pipe或FIFO)提出后,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中. 这样,即使与FIFO的创建进程不存在亲缘关系的进程,仅仅要可以訪问该路径,就行彼此通过FIFO相互通信 有名管道创建 int mkfifo(const char * pathname, mode_t mode)

进程间管道通信

父子进程间通过管道通信. 管道只能在具有公共祖先的两个进程间使用,通常,一个管道有另一个进程创建,在进程调用fork之后,这个管道就能在父进程和子进程之间使用了. 一般的进程,fd[0]表示读,fd[1]表示写. 如果有用到管道,则写进管道,从管道读. 父子进程之间. 所以,通过简单的read ,write函数,把目标文件设为fd[0] fd[1]即可以完成父子进程间的通信. write用法,read类似.   int write(int handle, void *buf, int nbyte

Windows上的多线程管道通信

一个管道实际上就是一块共享内存,它有两端,分别用于两个进程的读写.这里介绍下如何在Windows上实现线程之间的管道通信. 参考原文:Multithreaded Pipe Communication on Windows C#多线程管道通信 创建一个管道实例: IntPtr pipe = PipeCommunication.Pipe.CreateNamedPipe(                 PIPE_NAME,                  (uint)PipeCommunicati