Linux——命名管道及日志
linux——进程间通信及管道的应用场景-CSDN博客
文章目录
目录
文章目录
前言
一、命名管道是什么?
理解:
2、编写代码
makefile
管道封装成类,想用中管道时只需要调用实例化
读端
写端
日志
1、日志是什么?
2、日志有什么?
3、获取时间库函数
localtime编辑
4、完整代码
总结
前言
在我们循环创建子进程的时候,子进程回去拷贝父进程的页表,这样就会让下一个要创建的子进程指向上一个子进程。 就会像图片中的这样。
一、命名管道是什么?
- 定义
- 命名管道(Named Pipe)是一种进程间通信(IPC)机制。它可以在同一台计算机的不同进程之间,或者在跨越网络的不同计算机的进程之间进行通信。命名管道就像是一个管道,数据可以通过这个管道在进程之间流动,并且它有一个名字,就像文件一样可以被其他进程识别和访问。
- 与匿名管道的区别
- 匿名管道(Anonymous Pipe)只能用于具有亲缘关系(如父子进程)之间的通信,因为它没有名字,不能被其他无关联的进程访问。而命名管道可以被无关联的进程访问,只要这些进程知道命名管道的名字并且有适当的权限。
- 例如,在一个命令行管道操作中,如 “ls -l | grep file”,这里使用的是匿名管道,它是由 shell 创建来连接 “ls -l” 和 “grep file” 这两个命令的输出和输入,这两个命令是在同一个 shell 进程下启动的子进程,它们之间有亲缘关系。而如果要让两个独立开发的应用程序进行通信,就需要使用命名管道。
- 工作原理
- 命名管道在操作系统内核中创建了一个特殊的文件对象,这个文件对象有一个文件名(这就是命名管道的 “命名” 部分)。一个进程可以以写(write)模式打开这个管道,向管道中写入数据,就像向文件中写入数据一样。另一个进程可以以读(read)模式打开这个管道,从管道中读取数据。
- 例如,在一个简单的客户端 - 服务器架构的应用程序中,服务器进程创建一个命名管道并等待客户端连接。客户端进程通过管道的名字找到并打开这个管道,然后向管道发送请求数据。服务器进程读取这些请求数据,进行处理,再将结果通过管道返回给客户端。
mkfifo创建管道,写在磁盘上的;
如果毫不相关的进程两个进程间通信——命名管道
理解:
1、如果两个不同的进程,打开同一个文件的时候,在内核中,操作系统会打开几个文件呢?
实际上在操作系统上还是匿名管道那套逻辑。
进程间通讯的前提;
先让两个不同的进程看到同一份资源
管道文件不需要刷盘
内存级文件,所以不需要磁盘落盘也就是不需要写入磁盘
那么我们怎么知道打开的是同一个文件呢?为什么要打开同一个管道文件?
只要看到同路径下同一个文件名就知道看到同一个文件了
同路径下同一个文件名=路径+文件名(它们是为具有唯一性)这种管道就是命名管道
2、编写代码
想要不同的进程间通讯
形成两个毫不相关可执行文件
makefile
.PHONY:ALL
ALL: server client
server:server.ccg++ -o $@ $^ -g -std=c++11
client:client.ccg++ -o $@ $^ -g -std=c++11
.PHONY:cleanrm -rf strver client
管道封装成类,想用中管道时只需要调用实例化
#define FIFO_FILE "./myfifo"
#define MODE 0664using namespace std;
enum
{FIFO_CREATE_ERR = 1,FIFO_DELETE_ERR,FIFO_OPEN_ERR
};class Init
{
public:Init();~Init();
};Init::Init()
{int n = mkfifo(FIFO_FILE, MODE);if (n < 0){perror("mkfifo");exit(FIFO_CREATE_ERR);}
}Init::~Init()
{int m = unlink(FIFO_FILE);if (m < 0){perror("unlink");exit(FIFO_DELETE_ERR);}
}
读端
int main()
{Log log;Init init; // 在实例化的时候创建管道// 打开管道log.Enable(Onefile);int fd = open(FIFO_FILE, O_RDONLY);if (fd < 0){exit(FIFO_OPEN_ERR);}// 开始通信while (true){char buff[2024];int x = read(fd, buff, sizeof(buff));if (x == 0){break;}if (x > 0){buff[x] = {0};cout << "client say# " << buff << endl;}elsebreak;}close(fd);// 退出进程的时候调用析构删除管道return 0;
}
写端
int main()
{// 打开文件开始写int fd = open(FIFO_FILE, O_WRONLY);if (fd < 0){perror("open");exit(FIFO_OPEN_ERR);}cout << "client open file done" << endl;// 开始通讯string line;while (true){cout << "Please Enter@ ";getline(cin, line);write(fd, line.c_str(), line.size());}close(fd);return 0;
}
日志
1、日志是什么?
在计算机领域的日志
- 系统日志
- 系统日志是记录操作系统或软件系统运行过程中各种事件的文件。例如,Windows 操作系统会记录系统启动、设备驱动程序的加载和卸载、应用程序的安装和运行错误等信息。这些日志可以帮助系统管理员监控系统的健康状况,及时发现并解决潜在的问题,如安全漏洞、性能瓶颈等。
- 以 Linux 系统为例,系统日志文件通常存储在 “/var/log” 目录下,其中 “syslog” 文件记录了系统范围内的各种消息,包括内核消息、服务启动和停止信息等。当系统出现故障,如某个服务无法正常启动,管理员可以查看 syslog 文件,查找相关的错误提示,比如 “Failed to start [service name]” 这样的信息,来确定故障原因。
- 应用程序日志
- 应用程序日志是由各种软件应用记录自身运行时产生的事件。比如,一个 Web 服务器应用会记录每个客户端的访问请求,包括请求的时间、请求的资源(如网页文件)、请求的状态码(如 200 表示成功,404 表示未找到资源)等。对于开发人员来说,这些日志是调试程序的重要依据。
- 例如,一个电子商务网站的购物车应用程序会记录用户添加商品、删除商品、结算等操作的日志。如果用户反馈购物车结算出现问题,开发人员可以通过查看应用程序日志,查找在结算过程中是否有错误提示或者异常情况发生,比如数据库连接错误或者商品价格计算错误等。
2、日志有什么?
输出时间、日志的等级、日志内容、文件的名称和行号
日志的等级
lifo:常规消息
warning:报警信息
error:必要严重了,可能需要立即处理
fatal:致命的
Debug:调试
实现一个简单的日志函数
3、获取时间库函数
localtime
getoftime
日志格式
日志获取时间
默认部分+自定义部分
#pragma once#include<cstring>
#include <iostream>
#include <time.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
#define SIZE 1024#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4#define Screen 1
#define Onefile 2
#define Classfile 3#define LogFile "log.txt"void operator()(int level, const char *format, ...){time_t t = time(nullptr);struct tm *ctime = localtime(&t);char leftbuffer[SIZE];snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d]", levelToString(level).c_str(),ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday,ctime->tm_hour, ctime->tm_min, ctime->tm_sec);va_list s;va_start(s, format);char rightbuffer[SIZE];vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);va_end(s);// 格式:默认部分+自定义部分char logtxt[SIZE * 2];snprintf(logtxt, sizeof(logtxt), "%s %s\n", leftbuffer, rightbuffer);// printf("%s", logtxt); // 暂时打印printLog(level, logtxt);}
4、完整代码
#pragma once#include<cstring>
#include <iostream>
#include <time.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
#define SIZE 1024#define Info 0
#define Debug 1
#define Warning 2
#define Error 3
#define Fatal 4#define Screen 1
#define Onefile 2
#define Classfile 3#define LogFile "log.txt"class Log
{
public:Log(){printMethod = Onefile;path = "./log/";}void Enable(int method){printMethod = method;}std::string levelToString(int level){switch (level){case Info:return "Info";case Debug:return "Debug";case Warning:return "Warning";case Error:return "Error";case Fatal:return "Fatal";default:return "None";}}void printLog(int level, const std::string &logtxt){switch (printMethod){case Screen:std::cout << logtxt << std::endl;break;case Onefile:printOneFile(LogFile, logtxt);break;case Classfile:printClassFile(level, logtxt);break;default:break;}}void printOneFile(const std::string &logname, const std::string &logtxt){std::string _logname = path + logname;int fd = open(_logname.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0666); // "log.txt"if (fd < 0)return;write(fd, logtxt.c_str(), logtxt.size());close(fd);}void printClassFile(int level, const std::string &logtxt){std::string filename = LogFile;filename += ".";filename += levelToString(level); // "log.txt.Debug/Warning/Fatal"printOneFile(filename, logtxt);}~Log(){}void operator()(int level, const char *format, ...){time_t t = time(nullptr);struct tm *ctime = localtime(&t);char leftbuffer[SIZE];snprintf(leftbuffer, sizeof(leftbuffer), "[%s][%d-%d-%d %d:%d:%d]", levelToString(level).c_str(),ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday,ctime->tm_hour, ctime->tm_min, ctime->tm_sec);va_list s;va_start(s, format);char rightbuffer[SIZE];vsnprintf(rightbuffer, sizeof(rightbuffer), format, s);va_end(s);// 格式:默认部分+自定义部分char logtxt[SIZE * 2];snprintf(logtxt, sizeof(logtxt), "%s %s\n", leftbuffer, rightbuffer);// printf("%s", logtxt); // 暂时打印printLog(level, logtxt);}private:int printMethod;std::string path;
};
总结
命名管道(Named Pipe)是一种进程间通信(IPC)机制。它可以在同一台计算机的不同进程之间,或者在跨越网络的不同计算机的进程之间进行通信。命名管道就像是一个管道,数据可以通过这个管道在进程之间流动,并且它有一个名字,就像文件一样可以被其他进程识别和访问。
以 Linux 系统为例,系统日志文件通常存储在 “/var/log” 目录下,其中 “syslog” 文件记录了系统范围内的各种消息,包括内核消息、服务启动和停止信息等。当系统出现故障,如某个服务无法正常启动,管理员可以查看 syslog 文件,查找相关的错误提示,比如 “Failed to start [service name]” 这样的信息,来确定故障原因
相关文章:
Linux——命名管道及日志
linux——进程间通信及管道的应用场景-CSDN博客 文章目录 目录 文章目录 前言 一、命名管道是什么? 理解: 2、编写代码 makefile 管道封装成类,想用中管道时只需要调用实例化 读端 写端 日志 1、日志是什么? 2、日志有什么&#x…...
Flink 常见面试题
1、Flink 的四大特征(基石) checkpoin基于Chandy-Lamport算法实现了分布式一致性快照提供了一致性的语义 state丰富的StateAPI time实现了Watermark机制,乱序数据处理,迟到数据容忍 window开箱即用的滚动,滑动会话窗口…...
rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable
解决方法: 1、先测量pcf8563电源电压,是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间,未初始化,非法,芯片门槛电压检测配置不合理。使用hwclock命令写入一次,即可解决。 hwclock -f /dev/…...
(简单5步实现)部署本地AI大语言模型聊天系统:Chatbox AI + grok2.0大模型
摘要: 本文将指导您如何部署一个本地AI大语言模型聊天系统,使用Chatbox AI客户端应用和grok-beta大模型,以实现高效、智能的聊天体验。 引言: 由马斯克X-AI发布的Grok 2大模型以其卓越的性能超越了GPT4.0。Grok模型支持超长文本…...
MAUI APP开发蓝牙协议的经验分享:与跳绳设备对接
在开发MAUI应用程序时,蓝牙协议的应用是一个重要的环节,尤其是在需要与外部设备如智能跳绳进行数据交换的场景中。以下是我在开发过程中的一些经验和心得,希望能为你的项目提供帮助。 1. 蓝牙协议基础 蓝牙协议是无线通信的一种标准&#x…...
最新版Node.js下载安装及环境配置教程
目录 初识:Node.js 一、下载:Node.js 二、安装:Node.js 1.下载【node.js】压缩包安装文件 2.解压下载的安装包 3.打开解压的【node-v22.11.0-x64】文件夹 4.双击启动安装程序 5.点击【Next】 6.勾选【I accept the terms in the Lic…...
51c自动驾驶~合集39
我自己的原文哦~ https://blog.51cto.com/whaosoft/12707676 #DiffusionDrive 大幅超越所有SOTA!地平线DiffusionDrive:生成式方案或将重塑端到端格局? 近年来,由于感知模型的性能持续进步,端到端自动驾驶受到了来…...
单链表基础操作
文章目录 abstract定义结点结构初始化链表遍历链表求表长查找结点根据序号查找结点根据值查找结点 插入结点首尾位置插入一般位置插入(通用插入)找到尾元素|尾指针相关操作 删除结点 abstract 单链表是一种简单的动态数据结构,它由一系列结点组成,每个结…...
Asp.net MVC在VSCore中的页面的增删改查(以Blog项目为例),用命令代码
在VSCore中的页面的增删改查(以Blog项目为例) 1.创建项目(无解决方案)复杂项目才需要 dotnet new mvc -o Blog2.控制器 BlogsController.cs 控制器(Controller)名字和视图(View)中的文件名要一模一样 u…...
【Leecode】Leecode刷题之路第66天之加一
题目出处 66-加一-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 66-加一-官方解法 方法1:找出最长的后缀9 思路: 代码示例:(Java&#…...
使用 VLC 在本地搭建流媒体服务器 (详细版)
提示:详细流程 避坑指南 Hi~!欢迎来到碧波空间,平时喜欢用博客记录学习的点滴,欢迎大家前来指正,欢迎欢迎~~ ✨✨ 主页:碧波 📚 📚 专栏:音视频 目录 借助VLC media pl…...
Ubuntu 常用解压与压缩命令
.zip文件 unzip FileName.zip # 解压 zip DirName.zip DirName # 将DirName本身压缩 zip -r DirName.zip DirName # 压缩,递归处理,将指定目录下的所有文件和子目录一起压缩 zip DirName.zip DirName 行为: 只压缩 DirName 目录本身ÿ…...
【深度学习】四大图像分类网络之AlexNet
AlexNet是由Alex Krizhevsky、Ilya Sutskever(均为Hinton的学生)和Geoffrey Hinton(被誉为”人工智能教父“,首先将反向传播用于多层神经网络)在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…...
Day1——GitHub项目共同开发
MarkDowm解释 Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML代码。Markdown的目的是让文档的编写和阅读变得更加容易,同时也不失HTML的强大功能。以下是Markdown的一些基本概念和用法&a…...
基于PHP的香水销售系统的设计与实现
摘 要 时代科技高速发展的背后,也带动了经济的增加,人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中,给对方留下良好地第一印象的产品,在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大ÿ…...
A-star算法
算法简介 A*(A-star)算法是一种用于图形搜索和路径规划的启发式搜索算法,它结合了最佳优先搜索(Best-First Search)和Dijkstra算法的思想,能够有效地寻找从起点到目标点的最短路径。A*算法广泛应用于导航、…...
前端用原生js下载File对象文件,多用于上传附件时,提交之前进行点击预览,或打开本地已经选择待上传的附件列表
用于如上图场景,已经点击选择了将要上传的文件,在附件列表里面用户希望点击下载文件,以核实自己是否选中了需要上传的文件,此刻就需要 用到下面的方法: // 下载File对象文件 downloadByFileObject(file, { fileName }…...
服务器记录所有用户docker操作,监控删除容器/镜像的人
文章目录 使用场景安装auditd添加docker审计规则设置监控日志大小与定期清除查询 Docker 操作日志查看所有用户,所有操作日志查看特定用户的 Docker 操作查看所有用户删除容器/镜像日志过滤特定时间范围内日志 使用场景 多人使用的服务器,使用的docker …...
关于使用天地图、leaflet、ENVI、Vue工具实现 前端地图上覆盖上处理的农业地块图层任务
1.项目框架搭建 项目地址:Webgis: 一个关于webgis、天地图、Leaflet、Vue、数据库的学习框架。 ①git到本地,vscode打开。 ② 配置后端 搜索下载MySQL插件(前提:电脑中装有MySQL才可应用)。 连接数据库。 配置基本…...
基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 在现代社会…...
用 React 编写一个笔记应用程序
这篇文章会教大家用 React 编写一个笔记应用程序。用户可以创建、编辑、和切换 Markdown 笔记。 1. nanoid nanoid 是一个轻量级和安全的唯一字符串ID生成器,常用于JavaScript环境中生成随机、唯一的字符串ID,如数据库主键、会话ID、文件名等场景。 …...
如何离线安装dockerio
如何离线安装dockerio 一、下载Docker离线安装包二、上传离线安装包三、解压安装包四、复制文件到系统目录五、配置Docker服务六、设置文件权限并重新加载配置七、启动Docker服务八、设置开机自启动九、验证安装Docker是一个开源的容器化平台,用于开发、发布和运行应用程序。离…...
LocalDateTime序列化(跟redis有关)
使用过 没成功,序列化后是[2024 11 10 17 22 20]差不多是这样, 反序列化后就是: [ 2024 11 10.... ] 可能是我漏了什么 这是序列化后的: 反序列化后: 方法(加序列化和反序列化注解)&…...
【redis】如何跑
在 Windows 上配置 Redis 需要一些额外的步骤,因为 Redis 官方并没有为 Windows 提供原生支持。不过,可以通过以下方法来安装和配置 Redis。 方法一:使用 Windows 版 Redis(非官方版本) 下载 Redis for Windows Redis…...
Scala学习记录,全文单词统计
package test32 import java.io.PrintWriter import scala.io.Source //知识点 // 字符串.split("分隔符":把字符串用指定的分隔符,拆分成多个部分,保存在数组中) object test {def main(args: Array[String]): Unit {//从文件1.t…...
【MyBatis】验证多级缓存及 Cache Aside 模式的应用
文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口, 采用 Redis 会引入什么问题?万一遇到需强一致场景&#x…...
学习ASP.NET Core的身份认证(基于Session的身份认证3)
开源博客项目Blog中提供了另一种访问控制方式,其基于自定义类及函数的特性类控制访问权限。本文学习并测试开源博客项目Blog的访问控制方式,测试程序中直接复用开源博客项目Blog中的相关类及接口定义,并在其上调整判断逻辑。 首先是接口A…...
速盾:高防 CDN 可以配置客户端请求超时配置?
在高防 CDN(Content Delivery Network,内容分发网络)的运行管理中,客户端请求超时配置是一项重要的功能设定,它对于优化网络资源分配、保障服务质量以及维护系统稳定性有着关键意义。 一、客户端请求超时配置的概念 …...
DRM(数字权限管理技术)防截屏录屏----ffmpeg安装
提示:ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…...
使用PyQt5开发一个GUI程序的实例演示
一、安装Python 下载安装到这个目录 G:\Python38-32 安装完成有这些工具,后面备用: G:\Python38-32\Scripts\pyrcc5.exe G:\Python38-32\Scripts\pyuic5.exe 二、PyQt环境配置 pip install PyQt5 pip install pyqt5-tools 建议使用国内源,…...
网站如何做网页查询/app营销推广方案
websphere设置企业应用使用的jvm最大最小内存 设置jvm 内存的最大最小值。打开was管理控制台 点击应用程序服务器-----server1 点击java和进程管理前面的加号 点击进程定义 点击java虚拟机 这里写上数值,并保存后,重启server1 可能您还对以下事情兴…...
科技公司的网站/html网页制作模板代码
Redis入门与小案例1、Redis简介2、下载安装3、在java中使用Redis1.导入相关坐标2.相关实例1、Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持…...
网站的建设报价/东莞网络推广及优化
最近换了家公司,博主一直忙着做项目,没时间更简书,没能给大家带来更多的帮助,惭愧,趁现在抽出点时间,把最近用到的一个简便的小工具发布出来,仅供大家参考: 在一个label里面的文字显示不同的颜色和大小: 先晒出.h文件里面的类方法名称: #import <UIKit/UIKit.h> interfac…...
黄浦区seo网站建设/襄阳百度开户
VMware Workstation提供的可编程接口 在Vmware安装目录下能找到一个(默认:C:\Program Files (x86)\Vmware\Vmware Workstation) Vmrun.exe可执行文件。如果你从命令行敲入vmrun.exe(当然你得切换到workstation的根目录下),你会发现该命令提供了很多的参数…...
wordpress 搭建知识库/关键词优化哪家好
Indigo Studio是一款快速的UI原型和交互设计工具,能帮助你快速、简单地探索和创建功能性的、生动的UI原型,而且每一步都保证以用户体验为中心。通过Indigo Studio,你可以创建超过100种不同场景的、内置交互控件的框架和专用于桌面、网站和移动…...
上海装修公司网站建设/网络软文营销
下载地址 链接:https://pan.baidu.com/s/1hqtBQf6jRJINx4AgB8S2Tw 提取码:zxkt 第一卷 第二章 什么是深度学习 1、什么是什么学习 深度学习是机器学习的一个子领域,而机器学习又是人工智能(AI)的一个子领域。(其它所有的书也都是这么说)。“深度学习方法是具有多…...