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 ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在