linux 进程通信 管道,linux下有名管道进程通信

2023-11-09 05:30

本文主要是介绍linux 进程通信 管道,linux下有名管道进程通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、任务

1、学习mkfifo等函数;

2、了解有名管道的特点、阻塞打开与非阻塞打开等;

3、编写一个关于有名管道进程通信的程序,并运行。

二、相关概念

1、相关函数

创建有名管道的函数是mkfifo,函数原型是:

int mkfifo (const char *__path, __mode_t __mode)

功能:创建新的带命名路径的FIFO

参数:path — 命名管道路径

mode — 模式权限

返回值:成功返回0,失败返回-1;

2、有名管道的特点

a)、使不同进程之间完成通信。

通过mkfifo创建FIFO文件建立有名管道,

使得不同进程可以通过像访问文件的方式一样来访问有名管道,

fifo文件特点:先进先出:即写文件从有名管道数据尾端写入,数据读取从有名管道的开始处读取。

b)、有名管道内数据不支持如lseek()文件定位操作。

3、阻塞打开与非阻塞打开

对于读进程:

•若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入;

•若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0、

对于写进程:

•若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入;

•若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。

三、实验代码及运行结果

1、代码

分别输入形成三个文件 mkfifo.c、client.c、service.c,代码如下:

/*mkfifo.c*/

#include"stdio.h"

#include"unistd.h"

int main()

{

int ret;

ret=mkfifo("./a.c",0777);

if(ret<0)

{

printf("creat fifo a.c failure\n");

return -1;

}

printf("creat mkfifo.c sucess\n");

return 0;

}

/*service.c*/

#include"unistd.h"

#include"fcntl.h"

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

int main()

{

int fd;

char rdbuf[128]={0};

fd=open("./a.c",O_RDONLY);

if(fd<0)

{

printf("open fifo a.c failure\n");

return -1;

}

while(1)

{

read(fd,rdbuf,128);

printf("recv from fifo data:%s",rdbuf);

if(!strcmp(rdbuf,"quit\n"))

break;

memset(rdbuf,0,128);

}

sleep(1);

close(fd);

return 0;

}

/*client.c*/

#include"unistd.h"

#include"fcntl.h"

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

int main()

{

int fd;

char wrbuf[128];

fd=open("./a.c",O_WRONLY);

if(fd<0)

{

printf("open fifo a.c failure\n");

return -1;

}

while(1)

{

memset(wrbuf,0,sizeof(wrbuf));

fgets(wrbuf,128,stdin);

write(fd,wrbuf,strlen(wrbuf));

if(!strcmp(wrbuf,"quit\n"))

{

break;

}

}

sleep(1);

close(fd);

return 0;

}

2、编译运行

1)、生成可执行文件

终端输入:

gcc mkfifo.c -o mkfifo

gcc service.c -o service

gcc client.c -o client

2)、运行

先运行mkfifo,终端输入:./mkfifo

打开两个终端分别运行 service、client

终端分别输入 :  ./service       ./client

即可实现通信!

41b97a2ac7c9d35565329ca6df2c03f6.png

Linux下简单的socket通信实例

Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

Linux下查看某个进程打开的文件数-losf工具常用参数介绍

Linux下查看某个进程打开的文件数-losf工具常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux操作系统中,一切皆文件.通过文件不仅仅可以访问常规数据,还 ...

Linux下的管道命令有这些:

Linux下的管道命令有这些: 选取命令:cat grep 排序命令:sort wc uniq 双向重定向:tee 字符转换命令: tr, col, join, paste, expand 切割命令: ...

windows和linux下关闭Tomcat进程

windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

linux下的qt串口通信

1.linux下的qt串口通信跟windows唯一的差别就是端口号的名字,windows下面是COM,而linux是ttyUSB0的路径 2.一般情况下linux插上USB转串口线就可以在/dev/目 ...

Linux 下smi&sol;mdio总线通信

Linux 下smi/mdio总线通信 韩大卫@吉林师范大学 下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. 将下面代码编译后,将可执 ...

Linux下分析某个进程CPU占用率高的原因

Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用  1.top 查到占用cpu高的进程pid 2.查看该pid的线程 ...

解决linux下tomcat停止进程任存在问题

解决linux下tomcat停止进程任存在问题 在Linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访 ...

windows和linux下杀死Tomcat进程,解决端口占用

windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

随机推荐

Android之ListView性能优化——一行代码绑定数据——万能适配器

如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

Redis&lowbar;redis分布式锁-SETNX

因业务需要使用了redis的SETNX来实现分布式锁. 描述:Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXis ...

javascript练习-私有状态

在经典的面向对象编程中,经常需要将对象的某个状态封装或隐藏在对象内,只有通过对象的方法才能访问这些状态,对外只暴露一些重要的状态可以直接编写.这是就需要私有状态. function Range(fro ...

01day2

小明搬家 模拟 [问题描述] 小明要搬家了,大家都来帮忙. 小明现在住在第N楼,总共K个人要把X个大箱子搬上N楼. 最开始X个箱子都在1楼,但是经过一段混乱的搬运已经乱掉了.最后大家发现这样混乱地搬运 ...

Nopcommerce 3&period;7 增加了Redis 作为缓存啦

Nopcommerce 3.7  版增加了Redis 缓存,相比之前内存缓存, 感觉使用了Redis 作为缓存,明显加快了Web页面响应速度! 废话少说 拉代码: 1 git clone https: ...

Django之URL路由系统

一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...

C&plus;&plus;基础知识--DAY1

1. C语言是面向过程的语言,C++是面向对象的语言,相对于C语言来说,C++语法规则更为严格,其存在类型增强的问题. 类型增强,顾名思义就是C++相对于C语言来说有更加严格的类型检查,很多C语言的语 ...

first one

我说一句话你就知道我是干什么的 hello world

weakSelf 运用 strongSelf来解决block的循环引用

SDWebImage 中有一段源码: #if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication&qu ...

Ansible7:Playbook常用模块

目录 template set_fact pause wait_for assemble add_host group_by debug fail playbook的模块与在ansible命令行下使用 ...

这篇关于linux 进程通信 管道,linux下有名管道进程通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/374219

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Linux之软件包管理器yum详解

《Linux之软件包管理器yum详解》文章介绍了现代类Unix操作系统中软件包管理和包存储库的工作原理,以及如何使用包管理器如yum来安装、更新和卸载软件,文章还介绍了如何配置yum源,更新系统软件包... 目录软件包yumyum语法yum常用命令yum源配置文件介绍更新yum源查看已经安装软件的方法总结软

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Linux Mint Xia 22.1重磅发布: 重要更新一览

《LinuxMintXia22.1重磅发布:重要更新一览》Beta版LinuxMint“Xia”22.1发布,新版本基于Ubuntu24.04,内核版本为Linux6.8,这... linux Mint 22.1「Xia」正式发布啦!这次更新带来了诸多优化和改进,进一步巩固了 Mint 在 Linux 桌面

LinuxMint怎么安装? Linux Mint22下载安装图文教程

《LinuxMint怎么安装?LinuxMint22下载安装图文教程》LinuxMint22发布以后,有很多新功能,很多朋友想要下载并安装,该怎么操作呢?下面我们就来看看详细安装指南... linux Mint 是一款基于 Ubuntu 的流行发行版,凭借其现代、精致、易于使用的特性,深受小伙伴们所喜爱。对