🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
popen
在Linux中,popen是一个用于执行shell命令并建立一个管道连接的函数。它允许你在程序中执行一个shell命令,并通过标准输入或标准输出与命令进行交互。
popen函数的原型如下:FILE *popen(const char *command, const char *mode); 其中,command参数是一个字符串,表示要执行的shell命令。mode参数是一个字符串, 指定管道连接的模式,可以是"r"(读模式)或"w"(写模式)。 popen函数会返回一个FILE类型的指针,可以像操作普通文件一样使用它来读取或写入数据。
以下是一个示例,展示如何使用popen函数执行一个shell命令并读取其输出:
#include <stdio.h> int main() { FILE *fp; char output[1024]; // 执行shell命令并读取输出 fp = popen("ls -l", "r"); if (fp == NULL) { printf("Failed to run command\n"); return 1; } // 从管道中读取输出 while (fgets(output, sizeof(output), fp) != NULL) { printf("%s", output); } // 关闭管道连接 pclose(fp); return 0; } 在上述示例中,我们使用popen函数执行了一个ls -l命令,并将其输出读取到缓冲区中,然后逐行打印出来。
需要注意的是,在使用popen时,要小心处理命令参数,以避免潜在的安全风险,例如通过用户输入直接构造命令参数可能导致命令注入漏洞。
sz和rz
sz 和 rz 是两个用于在 Linux 系统上进行文件传输的命令行工具。
* sz:用于在从远程主机传输文件到本地时使用。它的作用是将文件从远程主机发送到本地主机。通常情况下,它与 rz 配合使用,以实现从本地上传文件到远程主机的功能。
* rz:用于在从本地主机传输文件到远程主机时使用。它的作用是在本地选择文件,然后将其发送到远程主机。通常情况下,它与 sz 配合使用,以实现从本地上传文件到远程主机的功能。
这两个命令通常用于通过 SSH 连接到远程主机,并在命令行界面上传或下载文件。要使用这些命令,你需要在本地和远程主机上都安装了 lrzsz 软件包。在大多数 Linux 发行版中,这个软件包是默认安装的,但如果没有安装,你可以使用包管理器来安装它。
下载lrzsz 软件包
在 Ubuntu 和 Debian 等基于 Debian 的发行版中 sudo apt-get update sudo apt-get install lrzsz
简单的聊天室
Comm.hpp
用于定义一些错误码
#pragma once enum { Usage_Err=1, Socket_Err, Bind_Err };
InetAddr.hpp
用于将网络字节序的ip地址转为主机字节序、用于将网络字节序的端口号转为主机字节序
#pragma once #include <iostream> #include <string> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> using namespace std; //用于将网络字节序的ip地址转为主机字节序 //用于将网络字节序的端口号转为主机字节序 class InetAddr { public: InetAddr(struct sockaddr_in &addr):_addr(addr) { _port = ntohs(_addr.sin_port); // 想看看客户端的端口号,ntohs(peer.sin_port),因为我们是从网络拿的数据,我需要将网络字节序转为主机序列 _ip = inet_ntoa(_addr.sin_addr); // 想看看客户端的ip,将网络字节序的ip地址转为主机字节序 } string Ip() { return _ip; } uint16_t Port() { return _port; } string PrintDebug() { string clientinfo = _ip + ":" + to_string(_port); return clientinfo; } const struct sockaddr_in& GetAddr() { return _addr; } bool operator==(InetAddr& addr) { return this->_ip==addr.Ip()&&this->_port==addr.Port(); } ~InetAddr() { } private: string _ip; uint16_t _port; struct sockaddr_in _addr; };
Lockguard.hpp
用于创建锁
#pragma once #include <pthread.h> class Mutex { public: Mutex(pthread_mutex_t* lock):_lock(lock) {} void Lock() { pthread_mutex_lock(_lock); } void Unlock() { pthread_mutex_unlock(_lock); } private: pthread_mutex_t *_lock; }; class Lockguard { public: Lockguard(pthread_mutex_t* lock):_mutex(lock) { _mutex.Lock(); } ~Lockguard() { _mutex.Unlock(); } private: Mutex _mutex; };
Log.hpp
用于记录日志,可以选择将日志输出到显示器、一个文件、根据日志等级进行分类文件
#include <iostream> #include <stdarg.h> #include <string> #include <ctime> #include <unistd.h> #include <fstream> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> using namespace std; // 定义一个枚举,表示日志级别 enum { Debug = 0, Info, Warning, Error, Fatal }; // 定义一个枚举,表示输出方式 enum