我是靠谱客的博主 专一黑裤,最近开发中收集的这篇文章主要介绍linux进程间通信fifo编程,【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

IPC(InterProcess Communication,进程间通信)是进程中的重要概念。Linux 进程之间常用的通信方式有:

文件:简单,低效,需要代码控制同步

管道:使用简单,默认阻塞

匿名管道 pipe:只存在于内核缓冲区,只能用于有血缘关系的进程

有名管道 FIFO:在文件系统中存在,可用于无血缘关系的进程

信号量:使用复杂,但开销小,操作系统本身支持信号量

内存映射区 mmap:进程有无血缘关系都可以

本地套接字 socket:稳定可靠

管道概念

通过管道,可以把一个进程的输出作为另一个进程的输入。管道分为两种:

匿名管道:主要用于两个进程间有父子关系的进程间通信

命名管道:主要用于没有父子关系的进程间通信

通常用的管道,都是匿名管道。管道实际上是一块内核缓冲区,不占用磁盘空间,但操作方式跟文件是一样的。

在 Linux 的命令行终端中,管道是再常用不过的命令技巧了。通过管道可以把前一个命令的输出作为后一个命令的输入。在 Linux 命令中通常通过符号 | 来使用管道。

例如,查看所有的进程,然后按关键字过滤:

ps aux | grep mysql

匿名管道

匿名管道是不能在文件系统中以任何方式看到的半双工管道,不占磁盘空间。管道的特点有:

一端只读或只写。读端、写端分别是一个文件描述符

操作管道的进程退出后,管道自动释放

管道默认是阻塞的

半双工,数据在管道内只能单向传输

匿名管道无法判断消息是否被读完,通常仅用于父进程向子进程传递数据,或子进程向父进程传递数据。此时可以在父子进程中关闭不用的读或写端。

管道是基于环形队列这个数据结构实现的,数据先进先出。默认的缓冲区大小是 4 KB,大小会自动调整。

单工:数据单向流动,例如遥控器

双工:数据可以同时双向流动,例如手机

半双工:数据可以双向流动,但不可同时双向流动,例如对讲机

pipe 函数

pipe() 函数用于创建匿名管道。.

函数原型:

#include

int pipe(int pipefd[2]);

参数:返回文件描述符数组,对应管道的两端,往写端写的数据会被内核缓存起来,直到读端将数据读完。其中:

pipefd[0]:读端

pipefd[1]:写端

返回值:成功返回 0,否则返回-1。

示例:

#include

#include

#include

int main()

{

int fd[2];

int ret, pid;

char buf;

ret = pipe(fd);

if (ret == -1)

{

perror("pipe error");

exit(1);

}

pid = fork();

if (pid == 0)

{

close(fd[1]);

while(read(fd[0], &buf, 1) > 0)

{

// 两种方式都可以实现输出

printf("%cn", buf);

write(STDOUT_FILENO, &buf, 1);

}

close(fd[0]);

}

else if (pid > 0)

{

close(fd[0]);

write(fd[1], "hello world", 12);

close(fd[1]);

wait(NULL);

}

else

{

perror("fork error");

exit(1);

}

close(fd[0]);

close(fd[1]);

return 0;

}

命名管道

命名管道也叫 FIFO 文件,在文件系统中以文件名的形式存在,大小为0。匿名管道无法在无关进程之间通信,但 FIFO 可以借助文件系统中的文件,使得同一主机内的所有的进程都可以通信。

进程通过 FIFO 通信时,首先要打开管道文件,然后使用 read 、write 函数通信。

mkfifo 函数

函数原型:

#include

#include

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

参数:

pathname:指定文件名

mode:指定文件的读写权限

返回值:

函数成功返回 0,否则返回-1 并设置 errno,常见 errno 有:

EACCES:pathname 所在的目录不允许执行权限

EEXIST:pathname 已经存在

ENOENT:目录部分不存在

ENOTDIR:目录部分不一个目录

EROFS:路径指向一个只读的文件系统

示例:

创建两个进程,一个将文件内容读到 FIFO,另一个从 FIFO 读内容写到另一个文件。

写 FIFO 的文件示例:

#include

#include

#include

#include

#include

#include

#define BUFSIZE 1024

int main(int argc, char *argv[]){

int ret;

int datafd, fifofd;

int bytes;

char buffer[BUFSIZE];

const char *fifoname = "/tmp/fifo";

if (argc != 2) {

printf("please input filenamen");

exit(EXIT_FAILURE);

}

if (access(fifoname, F_OK) < 0) {

ret = mkfifo(fifoname, 0777);

if (ret < 0) {

perror("mkfifo error");

exit(EXIT_FAILURE);

}

}

fifofd = open(fifoname, O_WRONLY);

datafd = open(argv[1], O_RDONLY);

if (fifofd < 0) {

perror("open fifo error");

exit(EXIT_FAILURE);

}

if (datafd < 0) {

perror("open file error");

exit(EXIT_FAILURE);

}

bytes = read(datafd, buffer, BUFSIZE);

while (bytes > 0) {

ret = write(fifofd, buffer, bytes);

if (ret < 0) {

perror("write fifo error");

exit(EXIT_FAILURE);

}

bytes = read(datafd, buffer, BUFSIZE);

}

close(fifofd);

close(datafd);

return 0;

}

读 FIFO 的文件示例:

#include

#include

#include

#include

#include

#include

#define BUFSIZE 1024

int main(int argc, char *argv[]) {

char *fifoname = "/tmp/fifo";

int fifofd, datafd;

int bytes, ret;

char buffer[BUFSIZE];

if (argc != 2) {

printf("please input a filename");

exit(EXIT_FAILURE);

}

fifofd = open(fifoname, O_RDONLY);

datafd = open(argv[1], O_WRONLY);

if (fifofd < 0) {

perror("open fifo error");

exit(EXIT_FAILURE);

}

if (datafd < 0) {

perror("open file error");

exit(EXIT_FAILURE);

}

bytes = read(fifofd, buffer, BUFSIZE);

while(bytes > 0) {

ret = write(datafd, buffer, bytes);

if (ret < 0) {

perror("write file error");

exit(EXIT_FAILURE);

}

bytes = read(fifofd, buffer, BUFSIZE);

}

close(datafd);

close(fifofd);

return 0;

}

【Linux 应用编程】进程管理 - 进程间通信IPC之共享内存 mmap

IPC(InterProcess Communication,进程间通信)是进程中的重要概念.Linux 进程之间常用的通信方式有: 文件:简单,低效,需要代码控制同步 管道:使用简单,默认阻塞 匿名 ...

Linux系统编程&commat;进程管理(一)

课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...

Linux系统编程&commat;进程管理(二)

1.创建守护进程(Deamon) 守护进程的概念与作用 后台服务程序 – 系统服务,进程名字往往以’d’结尾,生存周期比较长(系统装入时启动,关闭时候终止.系统装入两种启动方式:1从启动脚本.etc/ ...

Linux系统编程&commat;进程通信(一)

进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

UNIX环境高级编程——进程管理和通信(总结)

进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程   动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合  是个文件,可直观看到 程序program ...

Linux学习之进程管理&lpar;十九&rpar;

Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps ...

&lbrack;linux&rsqb; C语言Linux系统编程进程基本概念

1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件.进程是执行中的目标代码:活动的.生存的.运行的程序. 除了目标代码进程还包含数据.资源.状态以及虚拟化的计算机. 2.进程体系: 每一 ...

【Linux学习】Linux系统管理1—进程管理

Linux系统管理1-进程管理 一.Linux的三种进程 Linux包括3中不同类型的进程: 交互进程:由一个shell启动的进程.交互进程可以在前后台运行 批处理进程:该进程和终端无联系,是一个进程 ...

Linux下的进程管理

在操作系统系统中,进程是一个非常重要的概念. 一.Linux中进程的相关知识 1.什么是进程呢? 通俗的来说进程是运行起来的程序.唯一标示进程的是进程描述符(PID),在linux内核中是通过task ...

随机推荐

【转】error LNK2019&colon; 无法解析的外部符号 &quot&semi;&lowbar;&lowbar;declspec&lpar;dllimport&rpar;

生成DLL文件的字符集是Unicode而生成exe文件的字符集为默认的ASCII. 只要统一字符集即可解决问题: VS2005的c++项目默认字符集是使用 Unicode 字符集,在项目属性-> ...

问题解决——cout 输出 CString

Unicode下 wcout<

js&comma;css 和 html 分离,见仁见智

信经常观察大站的朋友都会发现,他们都把CSS写在HMTL页面里,一个页面的或者多个页面的背景图片,都集成到一张图片里,他们有的JS文件,也写到页面里了……也许你会迷惑,现在到处讲页面的优化,不都是要把 ...

hdf5 api

https://www.physics.ohio-state.edu/~wilkins/computing/HDF/hdf5tutorial/index.html

Echarts数据可视化grid直角坐标系(xAxis、yAxis),开发全解&plus;完美注释

全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

HashMap工作原理 和 HashTable

原文链接: Javarevisited 翻译: ImportNew.com - 唐小娟 译文链接: http://www.importnew.com/7099.html 你用过HashMap吗 譬如H ...

input autocomplete属性设计输入框自动联想(php实现)

因为客户临时要求加一个输入框自动联想,就开始了解这块.结合网上总结最难的一点就是找好对应的js版本以及相应的jQuery-ui: 以下是我用的版本,以及连接地址: jQuery的js文件:

oracle两种分页查询

第一种: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM table_name) A ) ; 第二种: SELECT * FROM ( ...

oracle 远程连接不到dba用户

如果要远程连接192.168.10.44上的oracle,那么192.168.10.44服务器必须启动TNSListener.(配置文件 listener.ora) http://www.111cn. ...

使用js实现登录随机验证码的效果

最后

以上就是专一黑裤为你收集整理的linux进程间通信fifo编程,【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO...的全部内容,希望文章能够帮你解决linux进程间通信fifo编程,【Linux 应用编程】进程管理 - 进程间通信IPC之管道 pipe 和 FIFO...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部