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 ;

}

6a1197c6780ae7aa8cf2701c6b8ef707.png

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)-进程通信&vert;命名管道

匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,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 ...

&lbrack;SCOI2005&rsqb;互不侵犯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服务&comma;电子秤例子&comma;开机自动启动

使用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的位置 查看文件是否配 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux父子进程管道通信是指在Linux操作系统中,父进程和子进程之间通过管道进行通信的过程。管道是一种特殊的文件,可以实现进程间的数据传输。在父进程创建管道后,可以通过fork()系统调用创建进程,并将管道的文件描述符传递给子进程。子进程可以通过管道读取父进程发送的数据,也可以向管道中写入数据,供父进程读取。这种通信方式可以实现进程间的数据共享和协作,是Linux操作系统中常用的进程间通信方式之一。 ### 回答2: 在Linux操作系统中,进程间通信是非常重要的一个功能。父子进程管道通信也是一种非常常用的进程间通信方式。 在Linux中,管道分为匿名管道和命名管道两种类型。匿名管道是由父进程创建,并将其写端的文件描述符传递给子进程。子进程就可以使用这个文件描述符来读取父进程写入管道的数据。而父进程也可以通过管道的另一端来读取子进程写入管道的数据。 在创建管道之前,我们需要使用系统调用pipe()来创建一个管道。具体的操作有两种方式,一种是用fcntl系统调用函数打开管道,另一种是用mkfifo函数创建命名管道。 在匿名管道中,父进程会在fork()函数之后,创建一个新的子进程。子进程会继承父进程文件描述符,包括匿名管道的读端和写端。父进程创建进程后,将匿名管道的写端关闭,并使用管道的读端来从管道中读取数据。同时,子进程在继承父进程文件描述符之后,也会关闭读端,并使用管道的写端来向管道中写入数据。 在命名管道中,父进程创建命名管道后,可以打开命名管道的读端和写端,并使用这个文件描述符来读取和写入数据。而子进程只需要打开命名管道的读端或写端即可,以便向管道中写入或读取数据。 总之,父子进程管道通信Linux操作系统中非常常见的一种进程间通信方式。通过匿名管道和命名管道,父进程和子进程可以方便地将数据传递给对方,从而实现进程间通信。 ### 回答3: Linux父子进程管道通信是指在一个进程创建了另一个进程,它们之间通过管道通信来实现信息的传递。管道是一种特殊的文件类型,分为匿名管道和命名管道两种。在Linux系统中使用最广泛的是匿名管道,它只能在局部范围内进行数据传输。 借助管道机制,父进程可以向子进程传递数据,也可以从子进程读取数据。通常情况下,父进程负责向子进程传递命令,子进程负责接收并处理命令,然后将结果返回给父进程。 当父进程创建进程后,它需要使用fork函数来完成进程复制。复制成功后,父进程和子进程就拥有了各自独立的内存空间和寄存器状态,它们之间的通信就需要通过特殊的IPC(Inter-Process Communication,进程间通信)机制来实现。 管道通信相对于其他的IPC方式来说比较简单,但是也存在一定的限制和缺陷。管道的数据传输是基于流的方式进行,因此无法识别消息之间的边界。同时,管道的传输速度依赖于缓冲区的大小和传输数据的大小,如果数据量过大可能会导致阻塞。 除了管道通信Linux还提供了其他多种IPC方式,如消息队列、共享内存、信号量等,每种方式都有自己的优缺点和适用范围。在使用IPC机制时,需要根据实际需要选择最合适的方式来完成进程间的通信,以提高程序运行效率和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值