IPC通信_无名管道(PIPE)

无名管道只能在具有公共祖先的两个进程间使用,且建议半双工使用(因为历史上就是半双工,虽然有些系统支持全双工管道)。

无名管道通过pipe函数创建

#include <unistd.h>
int pipe(int fd[2]);

其中:参数fd返回两个文件描述符,fd[0]只用来读,是输出,fd[1]只用来写,是输入。

举例:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
// linux支持双通道?
int main()
{
	int fd[2];
	int pid = 0;
	int n = 0;
	char buf[128] = {0};
	if(pipe(fd) < 0)
	{
		printf("pipe failed\n");
		return -1;
	}
	if(pid = fork() == 0)
	{// 子进程
		printf("child print\n");
		close(fd[0]);
		write(fd[1],"hello,this is child\n",40);
	}
	else
	{// 父进程
		printf("father print\n");
		close(fd[1]);
		n = read(fd[0],buf,sizeof(buf));
		if(n > 0)
		{
			printf("father print:%s\n",buf);
		}
	}
	sleep(2);
	exit(0);
}

  

原文地址:https://www.cnblogs.com/ho966/p/12254071.html

时间: 2024-10-08 11:13:44

IPC通信_无名管道(PIPE)的相关文章

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

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

Linux简单程序实例(GNU工具链,进程,线程,无名管道pipe,基于fd的文件操作,信号,scoket)

一, GNU工具链简介: (1)编译代码步骤: 预处理 -> 编译 -> 汇编 -> 链接: 预处理:去掉注释,进行宏替换,头文件包含等工作: gcc -E test.c -o test.i 编译:   不同平台使用汇编语言不同,汇编将高级语言编译成汇编语言: gcc -S test.c -o test.s 汇编:   将汇编语言翻译成二进制代码: gcc -c test.c -o test.o 链接:   包含各函数库的入口,得到可执行文件: gcc -o test test.c (2

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

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

IPC通信_消息队列

(共享内存,信号量,消息队列等方式时,有System v以及POXIS两种接口类型,这里介绍常用的systemV接口) 内核中的IPC结构(共享内存,信号量,消息队列)都用一个非法整数的标识符(identifier)加以引用.这里的标识符(identifier)是IPC对象的内部名. 为了使多个合作进程能够在同一IPC对象上汇聚,提供一个该IPC对象的外部名键(key),每一个IPC对象都与一个键(key)相关联. 消息队列是消息的链接表,存储在内核中,有消息队列标识符标识.下面描述几个涉及到的

IPC通信_共享内存

共享内存允许两个或多个进程共享一个给定的存储区,就是多个进程将同一块物理内存映射到自己的虚拟地址上.因为不需要在客户进程和服务进程之间拷贝,所以是最快的一种IPC. 函数1 #include <sys/shm.h> int shmget(key_t key, size_t size, int flag); 该函数转换键值获取共享内存ID, key键值的获取还是通过ftok函数. 返回值:成功返回共享内存ID, 失败返回-1 参数key:键值(key) 参数size:请求的共享内存的长度,单位字

无名管道通讯编程

创建无名管道用于父子间进程通信. 1.无名管道概念:无名管道又称pipe,是Linux所支持的IPC方式的一种,它具有以下特点: 1)只能用于具有血缘关系的进程之间. 2)属于半双工的通信模式,具有固定的读端和写端 3)是一种特殊的文件,存在于内存中,可通过read.write对其操作. 2.无名管道的用法 因为pipe存在于内存中,所以无法像操作普通文件那样通过指定路径来打开文件.通常的做法是在父进程中创建管道,再创建子进程.由于子进程继承了父进程打开的文件描述符,所以父子进程就可以通过创建的

Linux 进程间通信之管道(pipe),(fifo)

 无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int filedes[2]) filedes[0]为管道里的读取端 filedes[1]则为管道的写入端. 实现机制: 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条.管道的一端连接一个进程的输出.这个进程会向管道中放入信息.管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息.一个缓

关于有名管道和无名管道

先说一下有名管道和无名管道用的函数: 无名管道使用的是 pipe() 有名管道使用的是fifo() 无名管道主要用于有血缘关系的两个进程间通信,是内核使用环形队列机制实现,借助内核缓冲区实现的. 有名管道主要用于两个不相干的进程间通信,我认为之所以叫有名管道是因为他们借助mkfifo()函数创建的伪文件利用内核缓冲区进行通信,因为创建文件可以指定文件名所以操作和使用文件几乎一样. 首先关于无名管道 pipe()函数 需要指定两个文件描述符,通过pipe()函数创建一个管道使其一端读文件一端写 1

进程之间通信之有名管道、无名管道(pipe),笔记

             进程之间的通信作用1.数据传输   :一个进程需要将他的数据传到其他进程2.资源共享3.进程通知事件4.进程控制 :有些进程完全控制另一个进程的执行,如调试状态啊我们需要完全控制他的每一步操作: 通信发展历史Linux进程间的通信IPC由以下几个部分发展而来:1.UNIX进程之间的通信2.基于system v进程间的通信3.POSIX进程之间的通信(portable operating system interface) 现在Linux使用的进程间的通信方式包括:1.管