匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢?

  别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道……

  所谓命名管道,那便是拥有名字的管道,同时也被称之为FIFO,谈到FIFO,那么做过单片机开发的同学想必是不陌生的。

  在很多单片机的项目中,都使用过FIFO,FIFO其实是一种队列,先进先出,这样可以保证读出数据和写入数据的一致性。

  使用FIFO文件,便可以在不同的,且不具有亲属关系的进程中进程通信。

  创建命名管道的函数叫mkfifo(),关联两个头文件,分别是sys/types.hsys/stat.h

  函数mkfifo的原形如下:

  int mkfifo(const char * pathname, mode_t mode);

  其中参数pathname是,创建的文件名,在这里可以理解为管道名,

  参数mode是,指定所创建的文件的操作权限。

  在mkfifo创建管道之后,需要通过命名管道通信的进程,需要打开该管道文件,然后通过read,write等函数,像操作普通文件一样进行通信。

  现在开始编写代码:

  在两个没有亲戚关系的进程间通信,甲进程向乙进程发送信号,乙进程回复。

  下面是主机端的代码!

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
int main(int argc, char * argv[])
{
const char * fifoname = "fifo_temp";
int fd;
int byte;
int ret;
int datafd;
char buffer[] = {"nihao!"}; if (access(fifoname,F_OK) < )//这个函数的说明在最后!
{
ret =mkfifo(fifoname,);
if (ret < )
{
printf("主机端命名管道创建失败!\n");
exit();
}
}
printf("主机端打开FIFO文件……\n");
fd = open(fifoname,O_WRONLY);//不能以O_RDWR模式打开FIFO文件进行读写操作
printf("errno = %d\n",errno);
if (fd > )
{
printf("主机端打开FIFO成功!\n");
printf("主机端开始发送数据!\n");
ret = write(fd,buffer,sizeof(buffer));
if (ret < )
{
printf("主机端写入FIFO文件失败!\n");
exit();
}
printf("主机端文件写入FIFO成功!\n");
close(fd);
}
else
{
printf("主机端打开FIFO文件失败!\n");
} return ;
}

 下面是从机端的代码!

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h> int main(int argc, char *argv[] )
{
const char *fifoname = "fifo_temp";
int fd,datafd,ret;
int byte; char buffer[]; fd = open(fifoname, O_RDONLY);
printf("从机端打开FIFO文件!\n");
if (fd > )
{
printf("从机端打开FIFO文件成功!\n");
byte = read(fd,buffer,);
printf("从机端收到文件为:%s.\n",buffer);
close(fd);
} return ;
}

编译完毕后,结果如下:

黄色的那个就是管道文件,看它的开头是用P表示的。

程序执行结果如下:

  稍微解说一下,首先执行主机端,对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY)。

  open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止由于管道的操作open是阻塞的,所以主机端将会在

  fd = open(fifoname,O_WRONLY);
 这条代码中等待,只有在从机端启动后,以只读方式,同样也打开了那条管道,主机端才会继续执行下去。
如果不想阻塞,那么需要在open函数的调用的第二个参数中,设置选项O_NONBLOCK,选项O_NONBLOCK表示非阻塞,
 加上这个选项后,表示open调用是非阻塞的,如果没有这个选项,则表示open调用是阻塞的。
————————————————————————————————————————————————————————————————————————————————————————————————————————————

  这里为什么要加个与符号&呢?是为了让程序在后台执行,这样我们才能在主机端运行过程中,启动从机端的程序。

  当然,你也可以将主机端的程序设为守护进程,这样也能达到同样的效果。

————————————————————————————————————————————————————————————————————————————————————————————————————————————
 知识小结:
在主机端中,我使用了一个名叫access的函数。

 access():判断是否具有存取文件的权限

表头文件
    #include<unistd.h>
定义函数
    int access(const char * pathname, int mode);
函数说明
    access()会检查是否可以读/写某一已存在的文件。参数mode有几种情况组合, R_OK,W_OK,X_OK 和F_OK。R_OK,W_OK与X_OK用来检查文件是否具有读取、写入和执行的权限。

  F_OK则是用来判断该文件是否存在。由于access()只作权限的核查,并不理会文件形态或文件内容,因此,如果一目录表示为“可写入”,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。例如,你会发现DOS的文件都具有“可执行”权限,但用execve()执行时则会失败。
返回值
    若所有欲查核的权限都通过了检查则返回0值,表示成功,只要有一权限被禁止则返回-1。

Linux学习笔记(13)-进程通信|命名管道的更多相关文章

  1. linux学习笔记-13.进程控制

    1.查看用户最近登录情况 lastlastlog 2.查看硬盘使用情况 df 3.查看文件大小 du 4.查看内存使用情况 free 5.查看文件系统 /proc 6.查看日志 ls /var/log ...

  2. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  3. Linux学习笔记24——进程管道

    一 管道的作用 通常把一个进程的输出通过管道连接到另一个进程的输入. 二 popen和pclose函数 #include <stdio.h> FILE *popen(const char ...

  4. linux 进程学习笔记-named pipe (FIFO)命名管道

    与“无名管道”不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如“/tmp/my_fifo”,其对应到磁盘上的一个管道文件,如果我们用file命令来查看其文件类型的话,会得到如 ...

  5. Linux学习笔记13——使用curses函数库

    一 安装curses库 如果你的Linux系统中curses库,直接敲入命令sudo apt-get install libncurses5-dev,然后就会自动安装curses库,安装好之后敲入命令 ...

  6. linux学习笔记之进程

    一.基础知识 1:进程. 1,进程ID: 非负整数,具有唯一性. 1)ID=0的进程:调度进程/交换进程.内核的一部分.不执行任何磁盘上的程序. 2)ID=1的进程:init进程. 1-自举结束时,由 ...

  7. C# 进程通信-命名管道

    之前看wcf服务的时候看到wcf有支持管道通信协议,之前不知道,最近刚好有用到这个,这里写个简单实例 .net有已经封装好的pip通信的对象NamedPipeServerStream 和NamedPi ...

  8. Linux学习笔记13-用户和组

    操作系统通过用户.组概念来管理使用计算机的人 用户代表一个使用计算机的使用者,操作系统通过用户概念限制一个使用者能够访问的资源 组用来组织管理用户 用户具有以下概念: 每个用户有一个用户名和一个用户I ...

  9. Linux学习笔记13—Vi编辑器的学习

    文本编辑工具vim.vi1. vim与vi的最大区别是vim编辑的时候是带颜色显示的.Vi不带颜色显示.2. yum install -y vim-enhanced 如果没有安装VIM 使用上面的命令 ...

随机推荐

  1. Ubuntu Server 12.04下部署glusterfs

    1.安装环境 Linux:Ubuntuserver 12.04.1 LTS 64bit 2台 分布式文件系统:Gluster 测试环境:一台作文件服务器端(192.168.56.133),一台作客户端 ...

  2. Kinect开发资源汇总

    Kinect开发资源汇总   转自: http://www.sigvc.org/bbs/forum.php?mod=viewthread&tid=254&highlight=kinec ...

  3. .Net GridView 序号列

    给GridView增加一列:序号列 <asp:TemplateField HeaderText="序号"> <ItemTemplate> <%# (( ...

  4. mysql 语法

    -create database database_name; show databases;show tables;                                 | -creat ...

  5. 上个项目的一些反思 III

    离线缓存 之前的项目因为实时性要求比较高,所以一打开客户端,就开始做网络请求.现在想想,是没有做内容的离线缓存.这个问题,我没意识到.产品经理也没有意识到... 我觉得Archiver,来做比较合适, ...

  6. VC++ 设置软件开机自启动的方法

    0  概述 软件开机自启动是比较常用的做法,设置方法也有好几种. 1  使用者模式 在"开始菜单"的所有程序中有个"启动"文件夹,可以将需要设置为开机启动的应用 ...

  7. 如何做JS 单体模式的设计---->>js设计模式<<-------单体模式

    1. 单体模式是js中最基本 单最有用的模式之一,非常常用. 单体模式的基本结构如下: var Person = { name: 'lilu', age:', sayHi: function(){ a ...

  8. cmd连接mysql的方法详解(转载)

    连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...

  9. Alipay秘钥问题

    有三种秘钥一个是应用公钥 一个是支付宝公钥 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco } span.s1 { text-d ...

  10. iOS书写高质量代码之耦合的处理

    原创 2016-12-26 MrPeak MrPeak杂货铺 耦合是每个程序员都必须面对的话题,也是容易被忽视的存在,怎么处理耦合关系到我们最后的代码质量.今天Peak君和大家聊聊耦合这个基本功话题, ...