当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

C语言进程间通信(一)——管道

发表于: 2012-11-02   作者:ciaos   来源:转载   浏览次数:
摘要:   进程间通信(IPC)是指在不同进程之间传递信息。linux的进程通信方式有管道,消息队列,信号量,共享内存,套接口等方式,下面一一整理。 首先是管道(PIPE),管道是Unix系统IPC最古老的方式,所有的Unix系统都提供这种通信机制。它的优点在于简单易用,缺点在于有限制,详细见下面几点:   只能用于父子进程或兄弟进程之间通信 大多数系统中都是半双工的

 

进程间通信(IPC)是指在不同进程之间传递信息。linux的进程通信方式有管道,消息队列,信号量,共享内存,套接口等方式,下面一一整理。

首先是管道(PIPE),管道是Unix系统IPC最古老的方式,所有的Unix系统都提供这种通信机制。它的优点在于简单易用,缺点在于有限制,详细见下面几点:

 

  • 只能用于父子进程或兄弟进程之间通信
  • 大多数系统中都是半双工的,数据信息只能单向流动,如果需要双向通信则需要建立两个管道
  • 传输的是无格式字节流,需要双方约定格式
  • 管道缓冲区是有限的,等等
首先来看父子进程之间通信的例子。
#include<stdio.h>
#include<limits.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>

#define BUFSIZE PIPE_BUF  //管道默认一次性读取的数据长度

void err_quit(char *err) {
        printf("%s\n",err);
        exit(-1);
}

int main()
{
        int fd[2];
        char buf[BUFSIZE] = "hello my son";
        pid_t pid;

        if (pipe(fd) < 0) {
                err_quit("pipe error");
        }
        if ((pid = fork()) < 0) {
                err_quit("fork error");
        }
        else if(pid > 0) { //父进程
                close(fd[0]);
                write(fd[1], buf, strlen(buf));
        }
        else {
                close(fd[1]);
                int len = read(fd[0], buf, BUFSIZE);
                if (len < 0) {
                        err_quit("read error");
                }
                printf("Get : %s\n",buf);
        }
        return 0;
}
 接下来是兄弟进程之间通信的例子。
#include<stdio.h>
#include<limits.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>

#define BUFSIZE PIPE_BUF  //管道默认一次性读取的数据长度

void err_quit(char *err) {
	printf("%s\n",err);
	exit(-1);
}

int main()
{
	int fd[2];
	char buf[BUFSIZE] = "hello my brother";
	pid_t pid;

	if (pipe(fd) < 0) {
		err_quit("pipe error");
	}
	if ((pid = fork()) < 0) {
		err_quit("fork error");
	}
	else if(pid > 0) { //父进程

		if ((pid = fork()) < 0) {
			err_quit("fork error");
		}
		else if (pid > 0) { //父进程

		}
		else {
			close(fd[0]);
			write(fd[1], buf, strlen(buf));
		}
	}
	else {
		close(fd[1]);
		int len = read(fd[0], buf, BUFSIZE);
		if (len < 0) {
			err_quit("read error");
		}
		printf("Get : %s\n",buf);
	}
	return 0;
}
 代码都很简单,只是需要记住在创建新进程后记得分别关闭读写描述符。如果想让子进程给父进程传递数据,则关闭父进程的写描述符和子进程的读描述符即可。利用管道可以做简单的进程同步工作,因为读端会一直阻塞到写端发出数据后再运行后面的代码,可以利用这个特点保证让指定的进程先运行。

C语言进程间通信(一)——管道

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
http://blog.chinaunix.net/uid-26833883-id-3227144.html 前面我们学习了一下进程,我们知道多,进
Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对UNIX发展做出重大贡献的
      管道是linux的一种通信方式,一种两个进程间进行单向通信的机制,它提供了简单的流控制机
一 管道的局限性 管道有两个局限性:(1)他是半双工(即数据只能在一个方向上流动)。(2)它只能
函数原型 :intmkfifo(constchar*pathname,mode_tmode); 函数说明:创建一个命名管道,如果成功则返回0,
引子 好,到这里呢,就需要介绍实现进程间通信的第四种方式了, 也就是通过命名管道来实现,前面介
有名管道(FIFO) 首先将上一节的有关有名管道的定义再贴出来 有名管道是对无名管道的一种改进,它具
一. 管道:    1.只能用于具有亲缘关系的进程之间的通信      2.半双工通信模式    3.一
本文只是一个测试例子,核心代码是kernel32.dll中的一组windows api函数,这里不深入研究,代码都在
本文只是一个测试例子,核心代码是kernel32.dll中的一组windows api函数,这里不深入研究,代码都在
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号