1,进程间通信 (IPC ) Inter-Process Communication

  比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息。

2,linux下IPC机制的分类:管道、信号、共享内存、消息队列、信号量、套接字

3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只写一点用法吧。

3.1 特点

1)管道是最古老的IPC,但目前很少使用
     2)以文件做交互的媒介,管道分为有名管道和无名管道
     3)历史上的管道通常是指半双工管道

3.2 管道:有两种形式,命令行和非命令行

(1)命令行:

mkfifo testfifo
        echo "testfifo" >fifo
        cat fifo

(2)非命令行:这里又分有名管道无名管道

编程模型:进程A创建管道(mkfifo) -> 进程A写打开管道(open) -> 进程B读打开管道(open) -> 进程A开始往管道里写数据(write) ->

       进程B从管道中读数据(read) -> 进程A关闭管道(close) -> 进程B关闭管道(close) -> 删除管道(unlink)

有名管道(实例):

进程A:

#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h> #define PIPENAME "pipetest" int main()
{
// 创建管道
if(mkfifo(PIPENAME, ) < )
{
perror("mkfifo");
return -;
} // 写打开管道
int fd = open(PIPENAME, O_WRONLY);
if(- == fd)
{
perror("open");
return -;
} unlink(PIPENAME); int i = ;
for(i = ; i < ; i++)
{
write(fd, &i, sizeof(i));
printf("%d\n", i);
sleep(); // 这个是以秒为单位挂起
} // 关闭管道
close(fd); return ; }

进程B:

#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h> #define PIPENAME "pipetest" int main()
{
// 读打开管道
int fd = open(PIPENAME, O_RDONLY);
if(- == fd)
{
perror("open");
return -;
} int num = ;
int i = ;
for(i = ; i < ; i++)
{
read(fd, &num, sizeof(int));
printf("%d\n", num);
fflush(stdout); // 强制刷新输出缓冲区
} printf("\n");
close(fd); return ; }

运行效果如下:

开另外一个终端,运行读进程

无名管道:适用于父子进程之间的通信
     int pipe(int pipefd[2]):该函数在内核中创建管道文件,通过输出参数pipefd返回两个文件描述符,其中pipefd[0]用于读pipefd[1]用于写

注意:

  写数据的进程关闭读端pipefd[0]
      读数据的进程关闭写端pipefd[1]
实例:

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h> int main()
{
int fd[]; // 用来保存文件描述符
pipe(fd); pid_t pid = fork();// 创建进程
if(pid > )
{
// 父进程写管道,需要关闭读端
close(fd[]);
int i = ;
for(i=; i<; i++)
{
write(fd[], &i, sizeof(int));
sleep();
} close(fd[]);// 关闭写端
exit();
} // 子进程读管道
close(fd[]); // 先关闭写端
int x;
int i = ;
for(; i<; i++)
{
read(fd[], &x, sizeof(int));
printf("%d ", x);
setbuf(stdout, NULL);
}
close(fd[]);
printf("\n"); return ;
}

运行效果如下:

Linux进程间通信之管道的更多相关文章

  1. Linux 进程间通信(二) 管道

    Linux 进程间通信-管道 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源.但是,进程不是孤立的,不同的进程之间需要信息的交换以及 ...

  2. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  3. Linux进程间通信(一) - 管道

    管道(pipe) 普通的Linux shell都允许重定向,而重定向使用的就是管道. 例如:ps | grep vsftpd .管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准 ...

  4. Linux -- 进程间通信之管道

    管道是 Linux 里的一种文件类型,同时也是 Linux 系统下进程间通信的一种方式   创建一个管道文件有两种方式:  Shell 下命令 mkfifo + filename,即创建一个有名管道 ...

  5. linux进程间通信-有名管道(FIFO)

    有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的 ...

  6. Linux进程间通信-命名管道

    前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流 ...

  7. Linux进程间通信-匿名管道

    前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用. ...

  8. linux进程间通信--有名管道

    有名管道 只有当一个库函数失败时,errno才会被设置.当函数成功运行时,errno的值不会被修改.这意味着我们不能通过测试errno的值来判断是否有错误存在.反之,只有当被调用的函数提示有错误发生时 ...

  9. linux进程间通信--无名管道

    管道 只能用于具有亲缘关系的进程之间通信是一个半双工的通信模式, 具有固定的写读端和写端,管道可以看成一种特殊的文件,对它可以使用普通的read.write等操作 管道的创建: #include &l ...

随机推荐

  1. Sql Server之旅——第四站 你必须知道的非聚集索引扫描

    非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了...这时候就 有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划 ...

  2. 烂泥:nginx同时支持asp.net与php

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 经过两天的实验,终于让nginx同时支持asp.net与php了.下面就把具体的配置过程记录如下. 注意:本次实验OS:centos6 64bit. 尽 ...

  3. golang和vim-go安装配置

    一.Golang安装 1.下载golang安装包http://golangtc.com/download,我这里下载的是go1.6rc2.linux-amd64.tar.gz. 2.解压到安装目录,我 ...

  4. Redhat下如何搭建NFS

    环境: OS:Red Hat Linux As 5 服务器ip:192.168.50.199客户端ip:192.168.50.200 1.服务器上创建共享目录同时修改权限mkdir /bak1/nfs ...

  5. PHP实现文件上传下载——心在忙而已

    这一周都没有写什么东西,是啊,一周时间都没有学习太多新的东西,除了开车. 妈蛋啊,天天中午去学车然后两周没有午觉的日子还是很崩溃的,加上之后工作压力带来的心忙,宝宝不开心啊. 不过,也是自己不是那么能 ...

  6. MMORPG大型游戏设计与开发(客户端架构 part2 of vegine)

    一个好的接口是尽可能让更多实用的方法进行整理封装,要记住的是不常用的方法和类最好不好封装到接口中,因为那样会造成本身的困惑.基础模块中并没有太多封装,甚至连一个类的封装也没有,而是一些很常用的工具方法 ...

  7. HDU 2516 取石子游戏

    Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Secon ...

  8. NOIP2000单词接龙[DFS]

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  9. 分层开发之MySchool

    No.1实现登陆功能,验证用户名和密码.从数据库里进行匹配,看是否有符合要求的数据. 在DAL层编写代码,返回值为布尔类型.方法参数为(student实体类对象),使用参数化SqlParameter类 ...

  10. DOM、Window操作

    一.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 一.基本语法: 数据类型(字符串,小数,整数,布尔,时间) var, v ...