当前位置: 首页 > news >正文

Linux——命名管道及日志

linux——进程间通信及管道的应用场景-CSDN博客


文章目录

目录

文章目录

前言

一、命名管道是什么?

理解:

2、编写代码

makefile

管道封装成类,想用中管道时只需要调用实例化

读端

写端

日志

1、日志是什么?

2、日志有什么?

3、获取时间库函数

localtime​编辑

4、完整代码

总结


前言

 

在我们循环创建子进程的时候,子进程回去拷贝父进程的页表,这样就会让下一个要创建的子进程指向上一个子进程。 就会像图片中的这样。


一、命名管道是什么?

  1. 定义
    • 命名管道(Named Pipe)是一种进程间通信(IPC)机制。它可以在同一台计算机的不同进程之间,或者在跨越网络的不同计算机的进程之间进行通信。命名管道就像是一个管道,数据可以通过这个管道在进程之间流动,并且它有一个名字,就像文件一样可以被其他进程识别和访问。
  2. 与匿名管道的区别
    • 匿名管道(Anonymous Pipe)只能用于具有亲缘关系(如父子进程)之间的通信,因为它没有名字,不能被其他无关联的进程访问。而命名管道可以被无关联的进程访问,只要这些进程知道命名管道的名字并且有适当的权限。
    • 例如,在一个命令行管道操作中,如 “ls -l | grep file”,这里使用的是匿名管道,它是由 shell 创建来连接 “ls -l” 和 “grep file” 这两个命令的输出和输入,这两个命令是在同一个 shell 进程下启动的子进程,它们之间有亲缘关系。而如果要让两个独立开发的应用程序进行通信,就需要使用命名管道。
  3. 工作原理
    • 命名管道在操作系统内核中创建了一个特殊的文件对象,这个文件对象有一个文件名(这就是命名管道的 “命名” 部分)。一个进程可以以写(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博客 文章目录 目录 文章目录 前言 一、命名管道是什么&#xff1f; 理解&#xff1a; 2、编写代码 makefile 管道封装成类&#xff0c;想用中管道时只需要调用实例化 读端 写端 日志 1、日志是什么&#xff1f; 2、日志有什么&#x…...

Flink 常见面试题

1、Flink 的四大特征&#xff08;基石&#xff09; checkpoin基于Chandy-Lamport算法实现了分布式一致性快照提供了一致性的语义 state丰富的StateAPI time实现了Watermark机制&#xff0c;乱序数据处理&#xff0c;迟到数据容忍 window开箱即用的滚动&#xff0c;滑动会话窗口…...

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable

解决方法&#xff1a; 1、先测量pcf8563电源电压&#xff0c;是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间&#xff0c;未初始化&#xff0c;非法&#xff0c;芯片门槛电压检测配置不合理。使用hwclock命令写入一次&#xff0c;即可解决。 hwclock -f /dev/…...

(简单5步实现)部署本地AI大语言模型聊天系统:Chatbox AI + grok2.0大模型

摘要&#xff1a; 本文将指导您如何部署一个本地AI大语言模型聊天系统&#xff0c;使用Chatbox AI客户端应用和grok-beta大模型&#xff0c;以实现高效、智能的聊天体验。 引言&#xff1a; 由马斯克X-AI发布的Grok 2大模型以其卓越的性能超越了GPT4.0。Grok模型支持超长文本…...

MAUI APP开发蓝牙协议的经验分享:与跳绳设备对接

在开发MAUI应用程序时&#xff0c;蓝牙协议的应用是一个重要的环节&#xff0c;尤其是在需要与外部设备如智能跳绳进行数据交换的场景中。以下是我在开发过程中的一些经验和心得&#xff0c;希望能为你的项目提供帮助。 1. 蓝牙协议基础 蓝牙协议是无线通信的一种标准&#x…...

最新版Node.js下载安装及环境配置教程

目录 初识&#xff1a;Node.js 一、下载&#xff1a;Node.js 二、安装&#xff1a;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&#xff01;地平线DiffusionDrive&#xff1a;生成式方案或将重塑端到端格局&#xff1f; 近年来&#xff0c;由于感知模型的性能持续进步&#xff0c;端到端自动驾驶受到了来…...

单链表基础操作

文章目录 abstract定义结点结构初始化链表遍历链表求表长查找结点根据序号查找结点根据值查找结点 插入结点首尾位置插入一般位置插入(通用插入)找到尾元素|尾指针相关操作 删除结点 abstract 单链表是一种简单的动态数据结构&#xff0c;它由一系列结点组成&#xff0c;每个结…...

Asp.net MVC在VSCore中的页面的增删改查(以Blog项目为例),用命令代码

在VSCore中的页面的增删改查(以Blog项目为例) 1.创建项目&#xff08;无解决方案&#xff09;复杂项目才需要 dotnet new mvc -o Blog2.控制器 BlogsController.cs 控制器&#xff08;Controller&#xff09;名字和视图&#xff08;View&#xff09;中的文件名要一模一样 u…...

【Leecode】Leecode刷题之路第66天之加一

题目出处 66-加一-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 66-加一-官方解法 方法1&#xff1a;找出最长的后缀9 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&#…...

使用 VLC 在本地搭建流媒体服务器 (详细版)

提示&#xff1a;详细流程 避坑指南 Hi~&#xff01;欢迎来到碧波空间&#xff0c;平时喜欢用博客记录学习的点滴&#xff0c;欢迎大家前来指正&#xff0c;欢迎欢迎~~ ✨✨ 主页&#xff1a;碧波 &#x1f4da; &#x1f4da; 专栏&#xff1a;音视频 目录 借助VLC media pl…...

Ubuntu 常用解压与压缩命令

.zip文件 unzip FileName.zip # 解压 zip DirName.zip DirName # 将DirName本身压缩 zip -r DirName.zip DirName # 压缩&#xff0c;递归处理&#xff0c;将指定目录下的所有文件和子目录一起压缩 zip DirName.zip DirName 行为&#xff1a; 只压缩 DirName 目录本身&#xff…...

【深度学习】四大图像分类网络之AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever&#xff08;均为Hinton的学生&#xff09;和Geoffrey Hinton&#xff08;被誉为”人工智能教父“&#xff0c;首先将反向传播用于多层神经网络&#xff09;在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…...

Day1——GitHub项目共同开发

MarkDowm解释 Markdown是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成结构化的HTML代码。Markdown的目的是让文档的编写和阅读变得更加容易&#xff0c;同时也不失HTML的强大功能。以下是Markdown的一些基本概念和用法&a…...

基于PHP的香水销售系统的设计与实现

摘 要 时代科技高速发展的背后&#xff0c;也带动了经济的增加&#xff0c;人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中&#xff0c;给对方留下良好地第一印象的产品&#xff0c;在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大&#xff…...

A-star算法

算法简介 A*&#xff08;A-star&#xff09;算法是一种用于图形搜索和路径规划的启发式搜索算法&#xff0c;它结合了最佳优先搜索&#xff08;Best-First Search&#xff09;和Dijkstra算法的思想&#xff0c;能够有效地寻找从起点到目标点的最短路径。A*算法广泛应用于导航、…...

前端用原生js下载File对象文件,多用于上传附件时,提交之前进行点击预览,或打开本地已经选择待上传的附件列表

用于如上图场景&#xff0c;已经点击选择了将要上传的文件&#xff0c;在附件列表里面用户希望点击下载文件&#xff0c;以核实自己是否选中了需要上传的文件&#xff0c;此刻就需要 用到下面的方法&#xff1a; // 下载File对象文件 downloadByFileObject(file, { fileName }…...

服务器记录所有用户docker操作,监控删除容器/镜像的人

文章目录 使用场景安装auditd添加docker审计规则设置监控日志大小与定期清除查询 Docker 操作日志查看所有用户&#xff0c;所有操作日志查看特定用户的 Docker 操作查看所有用户删除容器/镜像日志过滤特定时间范围内日志 使用场景 多人使用的服务器&#xff0c;使用的docker …...

关于使用天地图、leaflet、ENVI、Vue工具实现 前端地图上覆盖上处理的农业地块图层任务

1.项目框架搭建 项目地址&#xff1a;Webgis: 一个关于webgis、天地图、Leaflet、Vue、数据库的学习框架。 ①git到本地&#xff0c;vscode打开。 ② 配置后端 搜索下载MySQL插件&#xff08;前提&#xff1a;电脑中装有MySQL才可应用&#xff09;。 连接数据库。 配置基本…...

基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 在现代社会…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...