2024-08-11

在Linux环境下,我们可以使用GNU的pool库来创建和管理线程池。pool库提供了一种简单的方式来并发地执行多个任务,并且可以通过日志来监控和调试线程池的运行情况。

以下是一个简单的示例,展示了如何使用pool库创建一个线程池,并向其中添加任务,同时记录日志:




#include <stdio.h>
#include <stdlib.h>
#include <pool.h>
 
// 任务函数,线程池将会执行这个函数
void *task_function(void *arg) {
    printf("任务正在执行: %s\n", (char *)arg);
    return NULL;
}
 
int main() {
    // 创建日志文件
    FILE *log_file = fopen("threadpool.log", "a");
    if (log_file == NULL) {
        perror("打开日志文件失败");
        return 1;
    }
 
    // 创建线程池,最大线程数为4
    pool *p = pool_new(4);
    if (p == NULL) {
        fprintf(stderr, "创建线程池失败\n");
        fclose(log_file);
        return 1;
    }
 
    // 设置日志文件
    pool_setlog(p, log_file);
 
    // 向线程池中添加任务
    for (int i = 0; i < 10; ++i) {
        char *task_desc = malloc(20);
        if (task_desc == NULL) {
            fprintf(stderr, "分配内存失败\n");
            pool_destroy(p);
            fclose(log_file);
            return 1;
        }
        sprintf(task_desc, "任务%d", i);
        pool_add(p, &task_function, task_desc);
    }
 
    // 等待所有任务完成
    pool_wait(p);
 
    // 清理
    pool_destroy(p);
    fclose(log_file);
 
    printf("所有任务已完成\n");
    return 0;
}

在这个示例中,我们首先创建了一个日志文件threadpool.log,然后创建了一个最大线程数为4的线程池。我们通过pool_setlog函数将日志文件与线程池关联起来,这样线程池在执行过程中产生的日志就会被记录到这个文件中。接着,我们向线程池中添加了10个任务,并最后等待所有任务完成后清理线程池资源。

这个示例展示了如何在Linux环境下使用pool库来创建线程池,并通过日志记录其运行情况。这对于调试和监控线程池非常有帮助。

2024-08-11

在Linux环境下登录MySQL,通常使用命令行工具mysql。以下是一个基本的登录示例:




mysql -u username -p

其中username是你的MySQL用户名。运行上述命令后,系统会提示你输入密码。

如果MySQL服务器不在本地或者你需要指定不同的端口,可以使用-h来指定主机地址,使用-P来指定端口:




mysql -h host_address -P port -u username -p

例如,如果你想要登录到位于192.168.1.10的MySQL服务器,端口是3306,用户名是myuser,你可以这样做:




mysql -h 192.168.1.10 -P 3306 -u myuser -p

输入命令后,系统会提示你输入myuser用户的密码。

如果你需要指定一个特定的数据库来连接,可以在登录后使用USE命令切换到该数据库,或者在登录时使用mysql -u username -p database_name的形式指定数据库:




mysql -u myuser -p mydatabase

在执行上述命令时,系统会提示你输入myuser用户的密码,登录成功后,你将直接进入mydatabase数据库。

2024-08-11

在Linux中使用MySQL及其配置通常涉及以下步骤:

  1. 安装MySQL服务器:

    
    
    
    sudo apt update
    sudo apt install mysql-server
  2. 启动MySQL服务:

    
    
    
    sudo systemctl start mysql
  3. 确保MySQL服务开机自启:

    
    
    
    sudo systemctl enable mysql
  4. 安全配置MySQL(设置root密码,移除匿名用户,禁止root远程登录等):

    
    
    
    sudo mysql_secure_installation
  5. 登录MySQL:

    
    
    
    mysql -u root -p
  6. 创建新用户和数据库(可选):

    
    
    
    CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
    CREATE DATABASE mydb;
    GRANT ALL PRIVILEGES ON mydb.* TO 'newuser'@'localhost';
    FLUSH PRIVILEGES;
  7. 查看MySQL服务状态:

    
    
    
    sudo systemctl status mysql
  8. 配置文件通常位于/etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf,可以通过编辑配置文件来修改配置。

这些步骤提供了一个基本的MySQL安装和配置流程。根据具体需求,可能还需要进行额外的配置,如调整缓冲区大小,设置最大连接数,调整默认字符集等。

2024-08-11

在Linux系统上配置C、C++和Go语言的编译环境通常涉及安装相应的编译器和工具链。以下是一个基本的安装步骤示例:

  1. 对于C语言和C++:



# 安装GCC编译器
sudo apt-update
sudo apt-get install -y build-essential
 
# 安装C++编译器(如果需要)
sudo apt-get install -y g++
  1. 对于Go语言:



# 下载并安装Go语言
wget https://dl.google.com/go/go1.15.6.linux-amd64.tar.gz
sudo tar -xvf go1.15.6.linux-amd64.tar.gz -C /usr/local
 
# 设置环境变量
echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile
source ~/.profile
 
# 设置Go代理(如果使用代理)
go env -w GOPROXY=https://goproxy.io,direct
 
# 验证安装
go version

请确保替换上述命令中的Go版本号为最新或所需的版本。以上命令假设您使用的是基于Debian的系统(如Ubuntu),对于其他Linux发行版,包管理器和安装命令可能会有所不同。

2024-08-11

在Windows环境下,使用Go语言编写的代码通常需要交叉编译才能生成Linux可执行文件。你可以使用GOOSGOARCH环境变量来指定目标操作系统和架构。以下是编译Linux可执行文件的步骤:

  1. 打开命令行界面(例如CMD或PowerShell)。
  2. 设置GOOSGOARCH变量。例如,如果你的目标是64位的Linux系统,可以这样设置:



SET GOOS=linux
SET GOARCH=amd64

如果你使用的是bash shell,则可以使用以下命令:




export GOOS=linux
export GOARCH=amd64
  1. 运行go build命令来编译你的Go程序。例如:



go build -o yourappname

这将编译当前目录中的Go程序,并输出一个名为yourappname的可执行文件,该文件可以在Linux系统下运行。

确保你的Go程序没有使用任何仅在Windows上可用的特定包或特性,否则编译将失败。如果你的程序包含这样的依赖项,你可能需要使用条件编译或者模拟实现来移植代码。

2024-08-11

udhcpc是Linux系统中用于自动处理DHCP(动态主机配置协议)的客户端程序。以下是一个简单的例子,展示如何使用udhcpc

  1. 确保你的系统中已经安装了udhcpc。在基于Debian的系统(如Ubuntu)中,可以使用以下命令安装:



sudo apt-install udhcpc
  1. 在你的网络接口配置文件中启用udhcpc。例如,如果你的网络接口是eth0,编辑/etc/network/interfaces文件,添加以下内容:



auto eth0
iface eth0 inet dhcp
  1. 启动udhcpc服务:



sudo udhcpc -i eth0
  1. 如果你想让udhcpc在启动时自动获取IP地址,可以在接口配置文件中移除手动指定IP的行:



# 注释或删除这行
# iface eth0 inet static
  1. 重启网络服务或者接口来让变更生效:



sudo /etc/init.d/networking restart
# 或者
sudo ifdown eth0 && sudo ifup eth0

现在udhcpc将会在每次启动时自动获取一个新的IP地址。如果需要,你可以通过/var/log/syslog或使用udhcpc-R选项来查看获取IP地址的过程。

2024-08-11



#!/bin/bash
# 安装 PHP 7.2.17 的脚本
 
# 定义 PHP 版本和依赖包
PHP_VERSION=7.2.17
DEVTOOLSET_VERSION=4
 
# 安装 EPEL 和 Remi 仓库
yum install -y epel-release
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
 
# 安装编译 PHP 所需的依赖包
yum install -y \
    gcc \
    gcc-c++ \
    make \
    zlib-devel \
    libxml2-devel \
    libjpeg-devel \
    libpng-devel \
    freetype-devel \
    giflib-devel \
    libmcrypt-devel \
    libicu-devel \
    libzip-devel \
    bzip2-devel \
    curl-devel \
    openssl-devel \
    sqlite-devel \
    systemd-devel \
    libxslt-devel \
    oniguruma-devel \
    libwebp-devel \
    libxpm-devel \
    libgd-devel \
    libxslt-devel \
    pcre-devel \
    recode-devel \
    krb5-devel \
    libldap2-devel \
    libjpeg-turbo-devel
 
# 安装 devtoolset,用于更高版本的 GCC 编译
yum install -y "centos-release-scl"
yum install -y "devtoolset-${DEVTOOLSET_VERSION}"
scl enable devtoolset-"${DEVTOOLSET_VERSION}" bash
 
# 下载 PHP 源码并解压
curl -LO https://www.php.net/distributions/php-"${PHP_VERSION}".tar.gz
tar xzf php-"${PHP_VERSION}".tar.gz
cd php-"${PHP_VERSION}"
 
# 配置 PHP 编译选项
./configure \
    --prefix=/usr/local/php \
    --with-curl \
    --with-freetype-dir \
    --with-gd \
    --with-gettext \
    --with-iconv-dir \
    --with-kerberos \
    --with-libdir=lib64 \
    --with-libxml-dir \
    --with-mysqli \
    --with-openssl \
    --with-pcre-regex \
    --with-pear \
    --with-pdo-mysql \
    --with-xmlrpc \
    --with-xsl \
    --with-zlib \
    --enable-bcmath \
    --enable-fpm \
    --enable-libxml \
    --enable-inline-optimization \
    --enable-mbregex \
    --enable-mbstring \
    --enable-opcache \
    --enable-pcntl \
    --enable-shmop \
    --enable-soap \
    --enable-sockets \
    --enable-sysvsem \
    --enable-xml \
    --enable-zip
 
# 编译和安装 PHP
make -j$(nproc)
make install
 
# 配置 PHP-FPM
cp php.ini-development /usr/local/php/lib/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
 
# 创建 systemd service 文件
tee /etc/systemd/system/php-fpm.service <<EOF
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
 
[Service]
Type=simple
PIDFile=/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --noda
2024-08-11



# 使用grep搜索特定文本
grep "特定文本" 文件名
 
# 使用正则表达式搜索特定模式
grep "正则表达式" 文件名
 
# 不区分大小写地搜索特定文本
grep -i "特定文本" 文件名
 
# 只输出匹配行的前后几行
grep -C 数量 "特定文本" 文件名
 
# 只输出匹配行的前面几行
grep -B 数量 "特定文本" 文件名
 
# 只输出匹配行的后面几行
grep -A 数量 "特定文本" 文件名
 
# 显示匹配行的行号
grep -n "特定文本" 文件名
 
# 只输出匹配的文件名
grep -l "特定文本" 文件名或目录
 
# 只显示没有匹配的行
grep -v "特定文本" 文件名
 
# 使用grep递归搜索目录中所有文件
grep -r "特定文本" 目录
 
# 使用grep时忽略二进制文件
grep -I "特定文本" 文件名或目录
 
# 使用grep时指定文件扩展名
grep "特定文本" 文件名 --include="*.扩展名"
 
# 使用grep时排除特定文件
grep "特定文本" 文件名 --exclude="文件名"
 
# 使用grep时排除目录
grep "特定文本" 文件名 --exclude-dir="目录名"
 
# 使用grep时同时排除多个文件或目录
grep "特定文本" 文件名 --exclude="文件名" --exclude-dir="目录名"
 
# 使用grep时打印匹配行的数量
grep -c "特定文本" 文件名
 
# 使用grep时仅输出匹配的部分
grep -o "特定文本" 文件名

这个示例展示了grep命令的一些常见用法,包括搜索特定文本、使用正则表达式、区分大小写、输出行号、递归搜索、忽略二进制文件、指定文件扩展名、排除特定文件和目录,以及打印匹配行的数量。这些是在日常工作中经常使用的grep命令的功能和用法。

2024-08-11



#!/bin/bash
 
# 获取系统运行时间、进程数、负载均值
uptime=$(uptime | awk '{print $3 $4}' | sed 's/,//')
procs=$(vmstat 1 2 | awk 'NR==3 {print $4}')
loadavg=$(vmstat 1 2 | awk 'NR==3 {print $13 $14 $15}')
 
# 输出系统信息
echo "系统运行时间: $uptime"
echo "当前进程数: $procs"
echo "负载均值: $loadavg"
 
# 获取内存信息
meminfo=$(vmstat 1 2 | awk 'NR==4 {print $12 $13 $14 $15}')
echo "内存信息: $meminfo"
 
# 获取虚拟内存信息
vmstatinfo=$(vmstat 1 2 | awk 'NR==5 {print $1 $2 $3 $4}')
echo "虚拟内存信息: $vmstatinfo"
 
# 获取IO统计信息
iostat=$(vmstat 1 2 | awk 'NR==6 {print $1 $2 $3 $4}')
echo "IO统计信息: $iostat"
 
# 获取CPU使用率信息
cpuinfo=$(vmstat 1 2 | awk 'NR==5 {print $5}')
echo "CPU使用率: $cpuinfo%"

这段代码使用了vmstat命令来获取系统的运行时间、进程数、负载均值、内存、虚拟内存、IO和CPU的相关统计信息,并将它们输出到控制台。这是一个简化版本的脚本,主要用于演示如何使用vmstat命令来获取系统信息,并且可以作为学习和参考。

2024-08-11

在Linux/Unix系统中,sed是一种流编辑器,它能够用于基于文本模式的搜索、替换、新增和删除等操作。下面是使用sed提取文件中特定行的几种方法:

  1. 提取第N行:



sed -n 'Np' filename

这里的N是你想提取的行号。例如,要提取第5行,你可以运行sed -n '5p' filename

  1. 提取从第N行到第M行:



sed -n 'N,Mp' filename

这里的N和M是你想提取的开始和结束行号。例如,要提取从第2行到第5行,你可以运行sed -n '2,5p' filename

  1. 提取匹配特定模式的行:



sed -n '/pattern/p' filename

这里的pattern是你想匹配的文本模式。例如,要提取含有单词"error"的所有行,你可以运行sed -n '/error/p' filename

  1. 提取从匹配特定模式开始到N行:



sed -n '/pattern/,+Np' filename

这里的pattern是你想匹配的文本模式,N是你想提取多少行。例如,要提取含有单词"start"的行开始,并且包括接下来的3行,你可以运行sed -n '/start/,+3p' filename

  1. 提取从第N行到匹配特定模式结束:



sed -n 'N,/pattern/p' filename

这里的N是你想开始提取的行号,pattern是你想匹配的文本模式。例如,要提取从第5行开始,并且包括接下来直到含有单词"end"的行结束,你可以运行sed -n '5,/end/p' filename

以上就是使用sed提取文件特定行的一些方法。记住,-n选项是用来告诉sed只输出被处理的行,而不自动输出输入文件的每行。