Linux第三十九章

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数C初学者入门训练题解CC的使用文章「初学」C++linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

popen

sz和rz

简单的聊天室

Comm.hpp

InetAddr.hpp

Lockguard.hpp

Log.hpp

nocopy.hpp

thread.hpp

ThreadPool.hpp

Udpserver.hpp

main.cc

UdpClient.cc

Makefile

运行结果


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值