linux 有名管道通信的创建的文件可能被其他进程破坏,Linux 进程通信(有名管道)...

有名管道(FIFO)

有名管道是持久稳定的。

它们存在于文件系统中。

FIFO比无名管道作用更大,因为他们能让无关联的进程之间交换数据。

管道文件一般用于交换数据。

shell命令创建管道

一个shell命令可以建立有名管道

--mkfifo [option] name

--mkfifo创建一个名为name的有名管道

--mkfifo fifo1 创建一个有名管道fifo1

--mkfifo -m fifo2 创建一个带权限的管道文件

--cat < fifo1 通过cat命令从fifo1中读取数据。

--ls > fifo1 将ls命令输出的结果写入fifo1中

shell命令删除管道

--"rm name"

代码创建管道fifo

mkfifo()函数是C语言库函数

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

参数pathname是文件名称,

参数mode是文件读写权限(读写权限是一位八进制数,例如0777(0表示八进制)表示当前用户,组用户,其他用户都拥有对该文件的可读,可写,可执行权限)

函数执行成功返回0,否则返回-,并设置变量errno。

代码删除管道

int unlink(const char *pathname);

unlink()函数是系统函数

函数执行成功返回0,否则返回-,并设置变量errno。

//代码创建有名管道

#include

#include

#include

#include

#include

#include

int main(int arg, char * args[])

{

if(arg

{

printf("请输入一个参数!\n");

return -;

}

int no=;

//创建有名管道

no=mkfifo(args[],);

if(no==-)

{

printf("创建管道失败!\n");

return -;

}

return ;

}

//代码删除有名管道

#include

#include

#include

#include

#include

int main(int arg, char * args[])

{

if(arg

{

printf("请输入一个参数!\n");

return -;

}

int no=;

//删除有名管道

no=unlink(args[]);

if(no==-)

{

printf("删除管道失败!\n");

return -;

}

return ;

}

打开和关闭FIFO

int open(const char * pathname,int flags);

int close(int fd);

Linux的一切都是文件这一抽象概念的优势,打开和关闭FIFO和打开关闭一个普通文件操作是一样的。

FIFO的两端使用前都必须打开

open中如果参数flags为O_RDONLY将阻塞open调用,一直到另一个进程为写入数据打开FIFO为止。

相同的,O_WRONLY也导致阻塞一直到为读出数据打开FIFO为止。

//有名管道读文件

#include

#include

#include

#include

#include

#include

#include

#include

int main(int arg, char *args[])

{

if (arg < )

{

printf("请输入一个参数!\n");

return -;

}

int fd = ;

char buf[] = { };

//打开管道文件

fd = open(args[], O_RDONLY);

if (fd == -)

{

printf("open the file failed ! error message : %s\n", strerror(errno));

return -;

}

while (read(fd, buf, sizeof(buf)) > )

{

printf("%s", buf);

memset(buf, , sizeof(buf));

}

//close the file stream

close(fd);

return ;

}

//管道写文件

#include

#include

#include

#include

#include

#include

#include

#include

int main(int arg,char * args[])

{

if(arg

{

printf("请输入一个参数!\n");

return -;

}

int fd=;

char buf[]={};

fd=open(args[],O_WRONLY);

if(fd==-)

{

printf("open the file failed ! error message :%s\n",strerror(errno));

return -;

}

while()

{

//从键盘上读取数据

read(STDIN_FILENO,buf,sizeof(buf));

if(buf[]=='')

{

break;

}

//写入管道文件中

write(fd,buf,strlen(buf));

memset(buf,,sizeof(buf));

}

//close the file stream

close(fd);

return ;

}

linux 有名管道通信的创建的文件可能被其他进程破坏,Linux 进程通信(有名管道)..._第1张图片

Linux进程通信----匿名管道

Linux进程通信中最为简单的方式是匿名管道 匿名管道的创建需要用到pipe函数,pipe函数参数为一个数组表示的文件描述字.这个数组有两个文件描 述字,第一个是用于读数据的文件描述符第二个是用于写数 ...

linux 进程通信之 管道和FIFO

进程间通信:IPC概念 IPC:Interprocess Communication,通过内核提供的缓冲区进行数据交换的机制. IPC通信的方式: pipe:管道(最简单) fifo:有名管道 mma ...

linux进程通信之管道

1.介绍: 1)同一主机: unix进程通信方式:无名管道,有名管道,信号 system v方式:信号量,消息队列,共享内存 2)网络通信:Socket,RPC 2.管道: 无名管道(PIPE):使用 ...

Linux 进程通信之管道

管道是单向的.先进先出的,它把一个进程的输出和还有一个进程的输入连接在一起.一个进程(写进程)在管道的尾部写入数据,还有一个进程(读进程)从管道的头部读出数据.数据被一个进程读出后,将被从管道中删除, ...

Linux进程通信——管道

管道(pipe)本质上是一种文件,管道通信本质上是通过读写文件通信,但是管道解决了文件的两个问题:限制管道大小,解决read()调用文件结束问题. 管道一个环形的缓冲区,通过两个进程以生产者/消费者的 ...

Linux下进程通信之管道

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把 ...

进程通信类型 管道是Linux支持的最初Unix IPC形式之一

管道 Linux环境进程间通信(一) https://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html 管道及有名管道 郑彦兴200 ...

Linux学习笔记(13)-进程通信|命名管道

匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名 ...

linux 进程通信 管道

1. 管道概述及相关API应用 1.1 管道相关的关键概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管 ...

随机推荐

函数randint的使用

摘自百科: ANDINT 在MATLAB中用于产生基质的均匀分布的随机整数. 用法: 1.OUT = RANDINT 产生一个“ 0 ”或“ 1 ”等概率 2.OUT = RANDINT(M) 生成的 ...

解锁scott用户及设置密码

关于Oracle 10g scott用户解锁的方法两则 解决方法一. 首先确认已经安装oracle 数据库和客户端 在客户端DOS下执行如下语句: 注意提示符号 c:\sqlplus /nolog s ...

使用yuicompressor-maven-plugin压缩js及css文件

本文介绍通过使用yuicompressor-maven-plugin插件实现js及css代码的自动压缩,方便集成到持续集成环境中,如jenkins. 一.配置yuicompressor-maven-p ...

[SCOI2005]互不侵犯King

题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. ——by洛谷 https://www. ...

JSF简单介绍

JSF简单介绍 一. 什么是 JSF: JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架.它提供了一种以组件为中心来开发 Java Web 用户界 ...

Ubuntu 设备 spark

周围环境: Unbunt 12.04 Hadoop 2.2.x Sprak 0.9 Scala scala-2.9.0.final.tgz 一步 1. 下载 scala 2. 解压scala,然后改动 ...

JavaScript之创建对象

不定义JQuery插件,不要说会JQuery 一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对 ...

java做成windows服务,电子秤例子,开机自动启动

使用Java Service Wrapper工具制作 1.windows32位下载地址 https://sourceforge.net/projects/wrapper/files/ 2.window ...

浅析Xilinx 三速以太网MAC IP核

之前在使用Altera的三速以太网MAC IP的基础上,完成了UDP协议数据传输.此次为了将设计移植到xilinx FPGA上,需要用到xilinx的三速以太网MAC IP核,当然也可以自己用HDL编 ...

lnmp环境 swoole聊天室

pecl install swoole 安装php扩展swooleservice php-fpm restart 重启php服务whereis php.ini 查看php.ini的位置 查看文件是否配 ...

你可能感兴趣的:(linux)