Linux进程间通信程序设计2----管道通信

一、无命名管道

1、什么是管道

管道是单向、先进先出的,把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道尾部写入数据,另一个进程(读进程)在管道头部读出数据。

2、管道创建

无名管道:(只)父进程与子进程间的通信。

有名管道:同一系统中任意两个进程间的通信。

无名管道由pipe()函数创建;

int pipe(int filedis[2]);

当一个管道建立时,它会创建两个文件描述符:filedis[0]用于读管道,filedis[1]用于写管道。

管道通信:

关闭管道只需要将文件描述符关闭即可。可以使用close函数逐一关闭。

例如:创建管道yu关闭

int main()

{

  int pipe_fd[2];

  if(pipe(pipe_fd)<0)

  {

    printf("pipe create error\n");

    return -1;

  }

else{

    printf("pipe create success\n")

  }

  close(pipe_fd[0]);

  close(pipe_fd[1]);

}

3、管道读写

管道用于不同进程间的通信。通常先创建一个管道,再通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道。

注意:必须在系统调用fork()前,调用pipe(),否则子进程将不会继承文件描述符。

二、命名管道(FIFO)

无命名管道只能父子进程使用;但是命名管道,不相关的进程也能交换数据。

实质上讲:命名管道就是个文件

1、创建

#include<sys/types.h>

#include<sys/stat.h>

int mkfifo(const char* pathname,mode_t mode)

pathname:FIFO文件名

mode:属性S_IRUSR     S_IWUSR    S_IXUSR    S_IRWXU。

一旦创建了FIFO,就可以用open close read write 操作FIFO。

2、操作

当打开FIFO,非阻塞标志(O_NONBLOCK)将对以后读写产生如下影响:

1)没有使用O_NONBLOCK:访问要求无法满足时进程将阻塞。如试图读取空的FIFO,将导致进程阻塞。

2)使用O_NONBLOCK:访问要求无法满足时不阻塞,立即出错返回,errno是ENXIO。

Linux进程间通信程序设计2----管道通信

时间: 2024-10-30 00:41:16

Linux进程间通信程序设计2----管道通信的相关文章

Linux进程间通信程序设计-1

一.进程间通信概述: 1.目的:为什么要进行进程间通信? 1)数据传输:一个进程需要把他的数据发送给另一个进程. 2)资源共享:协调共享资源. 3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件. 4)进程控制 2.发展 Linux进程间通信(IPC)由以下几部分发展而来: 1)UNIX进程间通信 2)基于System V进程间通信(System 5是UNIX操作系统众多版本中的一支) 3)POSIX进程间通信(POSIX可移植的操作系统接口) 3.分类 现在Linux

Linux进程间通信 -- 使用命名管道

在前一篇文章—— Linux进程间通信 -- 使用匿名管道 中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便.这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题. 一.什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似. 由于Linux中所有

Linux进程间通信 -- 使用匿名管道

在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式——匿名管道,通过它进程间可以交换更多有用的数据. 一.什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号“|"来使用管道,但是管理的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入. 举个例子,在shell中输入命令:ls -l

Linux进程间通信程序设计6----信号量

主要用途:保护临界资源 二值信号灯:最大为1 计数信号灯:多进程可访问.减1操作. 等待自动唤醒. 信号量的集合 #include<sys/types.h> #include<sys/ipc.h> #include<sys/sem.h> 创建/打开 int semget(key_t key,int nsems,int semflg) key:键值,由ftok获得. nsems:指定打开或者新创建的信号灯集中将包含信号灯的数目. semflg:标识,同消息队列. 操作 i

Linux进程间通信程序设计4----共享内存

共享内存 共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存写入了数据,共享这个内存区域的所有进程就可以立即看到其中的内容. 共享内存实现分为连个步骤: 一.创建共享内存,使用shmget函数. 二.映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数. Linux进程间通信程序设计4----共享内存

练习--LINUX进程间通信之无名管道PIPE

IBM上放的这个系统不错,刚好可以系统回温一下LINUX的系统知识. http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/ 感觉年纪大了,前几年看的LINUX内核和系统的东东,忘了很多,要慢慢转化成永久记忆才可以. 今天,又拿起<LINUX内核设计与实现>,慢慢啃下去. ~~~~~~~~~~~~~~ 进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想

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

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

简述Linux进程间通信之命名管道FIFO

上文聊到管道(pipe),可以使有亲缘关系的进程间进行通信. 对于没有亲缘关系的进程如何通信?本文来聊一聊命名管道FIFO. 一.概念 命名管道FIFO,提供一个路径名与之关联,以文件形式存储于文件系统中. 一个进程以r方式打开,另一个程序以w方式打开,即可在两个进程之间建立管道. 通过以fifo文件作为媒介,可以使任意两个进程通过该文件进行通信. 命名管道(fifo)特性与管道(pipe)类似,不必赘述. 下面我们看FIFO如何进行进程间通信,首先来介绍一下所用到的函数: 二.函数原型 #in

Linux环境下实现管道通信-问题

#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <errno.h> #include <string.h> #include <stdio.h> #include <stdlib.h> int main( ) { pid_t pid1,pid2; int pipe_fd[2]; char w_buffer[100],r_bu