0 Linux环境变量
Linux环境变量配置方法一: export PATH
export PATH=/home/uusama/mysql/bin:$PATH
# 或者把PATH放在前面
export PATH=$PATH:/home/uusama/mysql/bin
- 生效时间:立即生效
- 生效期限:当前终端有效,窗口关闭后无效
- 生效范围:仅对当前用户有效
- 配置的环境变量中不要忘了加上原来的配置,即
$PATH
部分,避免覆盖原来配置
Linux环境变量配置方法二: vim ~/.bashrc
vim ~/.bashrc
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
- 生效时间:使用相同的用户打开新的终端时生效,或者手动
source ~/.bashrc
生效 - 生效期限:永久有效
- 生效范围:仅对当前用户有效
- 如果有后续的环境变量加载文件覆盖了PATH定义,则可能不生效
Linux环境变量配置方法三: vim ~/.bash_profile
- 生效时间:使用相同的用户打开新的终端时生效,或者手动
source ~/.bash_profile
生效 - 生效期限:永久有效
- 生效范围:仅对当前用户有效
- 如果没有
.bash_profile
文件,则可以编辑.profile
文件或者新建一个
Linux环境变量配置方法四: vim /etc/bashrc
该方法是修改系统配置,需要管理员权限(如root)或者对该文件的写入权限
# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/bashrc
vim /etc/bashrc
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
- 生效时间:新开终端生效,或者手动
source /etc/bashrc
生效 - 生效期限:永久有效
- 生效范围:对所有用户有效
Linux环境变量配置方法五: vim /etc/profile
# 如果/etc/profile文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/profile
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
- 生效时间:新开终端生效,或者手动
source /etc/profile
生效 - 生效期限:永久有效
- 生效范围:对所有用户有效
Linux环境变量配置方法六: vim /etc/environment
# 如果/etc/bashrc文件不可编辑,需要修改为可编辑
chmod -v u+w /etc/environment
vim /etc/profile
# 在最后一行加上
export PATH=$PATH:/home/uusama/mysql/bin
- 生效时间:新开终端生效,或者手动
source /etc/environment
生效 - 生效期限:永久有效
- 生效范围:对所有用户有效
1 libevent 简介
简介
Libevent是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:
事件驱动( event-driven),高性能轻量级,专注于网络,不如ACE那么臃肿庞大:源代码相当精炼、易读:跨平台,支持 Windows、 Linux、BSD和 Mac Os:支持多种IO多路复用技术, epoll, poll、 dev/poll, select和 kqueue等。支持I/O,定时器和信号等事件、注册事件优先级。
Chromium、Memcached、NTP、HTTPSQS等著名的开源程序都使用libevent库。
libevent核心
Reactor(反应堆)模式是 libevent的核心框架, libevent以事件驱动,自动触发回调功能。
2 libevent (vcpkg)安装
git https://github.com/libevent/libevent.git
2.1 安装vcpkg
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
提示下面的信息(后面放在CMakeLists中,CMAKE_TOOLCHAIN_FILE用于获取到安装库的路径)
-CMAKE_TOOLCHAIN_FILE=/home/xhh/Downloads/app/vcpkg/scripts/buildsystems/vcpkg.cmake
2.2 安装libevent
./vcpkg install libevent
提示下面的信息(后面放在CMakeLists中用)
find_package(Libevent CONFIG REQUIRED)
target_link_libraries(main PRIVATE libevent::core libevent::extra libevent::pthreads)
2.3 测试libevent
#include <event.h>
#include <stdio.h>
int main(){
const char **methods = event_get_supported_methods();
for(int i = 0; methods[i] != nullptr; ++i){
printf("%s is support .\n", methods[i]);
}
struct event_base *base = event_base_new();
printf("curr os supprot [%s] \n", event_base_get_method(base));
return 0;
}
2.4 编写CMakeLists.txt
V1版本
cmake_minimum_required(VERSION 2.8)
# [2.1] vcpkg.camke---> setting vcpkg path [NICE!]
set(CMAKE_TOOLCHAIN_FILE /home/xhh/Downloads/app/vcpkg/scripts/buildsystems/vcpkg.cmake)
project(TESTPOOL)
add_compile_options(-std=c++11) # C++11
set(CMAKE_BUILD_TYPE "DEBUG") # debug mode
# [2.2] 找event包
find_package(Libevent CONFIG REQUIRED)
add_executable(main main.cpp)
# [2.2] 找event的库 -levent
target_link_libraries(main PRIVATE libevent::core libevent::extra libevent::pthreads)
V2版本-利用${}
cmake_minimum_required(VERSION 2.8)
# setting vcpkg path [NICE!]
set(CMAKE_TOOLCHAIN_FILE "/home/xhh/Downloads/app/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
project(TESTPOOL)
add_compile_options(-std=c++11) # C++11
set(CMAKE_BUILD_TYPE "DEBUG") # debug mode
find_package(Libevent CONFIG REQUIRED)
add_executable(${
PROJECT_NAME} main.cpp)
# -levent
target_link_libraries(${
PROJECT_NAME} PRIVATE libevent::core libevent::extra libevent::pthreads)
V3版本-把vcpkg.cmake添加至系统变量
- 添加系统变量
vim ~/.bashrc
export VCPKG="/home/xhh/Downloads/app/vcpkg/scripts/buildsystems/vcpkg.cmake"
vim ~/.bashrc
export VCPKGHOME="/home/xhh/Downloads/app/vcpkg"
- 使用系统变量地址
# 修改这一行 "$ENV{VCPKG}" 获取环境变量中设置的VCPKG
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG}" CACHE STRING "Vcpkg toolchain file")
2.5 Clion中使用vcpkg(PASS)
2.6 VsCode中使用vcpkg
【Linux】Vscode & CMake实战开发:用于配置Vscode
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
# setting vcpkg path [NICE!]
# set(CMAKE_TOOLCHAIN_FILE "/home/xhh/Downloads/app/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")
// set(CMAKE_TOOLCHAIN_FILE $ENV{VCPKG} CACHE STRING "Vcpkg toolchain file")
set(CMAKE_TOOLCHAIN_FILE $ENV{
VCPKGHOME}/scripts/buildsystems/vcpkg.cmake CACHE STRING "Vcpkg toolchain file")
project(MAINCXX)
add_compile_options(-std=c++11) # C++11
set(CMAKE_BUILD_TYPE "DEBUG") # debug mode
find_package(Libevent CONFIG REQUIRED)
add_executable(${
PROJECT_NAME} main.cpp)
# -levent
target_link_libraries(${
PROJECT_NAME} PRIVATE libevent::core libevent::extra libevent::pthreads)
c_cpp_properties.json
用于包含vcpkg的第三方头文件include(声明,no定义)
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
// [xhh] add vcpkg all lib-include
// "/home/xhh/Downloads/app/vcpkg/installed/x64-linux/include",
"${VCPKGHOME}/installed/x64-linux/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
settings.json
包含编译链工具 CMAKE_TOOLCHAIN_FILE
{
"files.associations": {
"iostream": "cpp"
},
// [xhh] add cmake
"cmake.configureSettings": {
// "CMAKE_TOOLCHAIN_FILE": "/home/xhh/Downloads/app/vcpkg/scripts/buildsystems/vcpkg.cmake",
"CMAKE_TOOLCHAIN_FILE": "${VCPKGHOME}/scripts/buildsystems/vcpkg.cmake"
}
}
3 libevent 使用
3.1 基本API
对于不同系统而言, event_ base就是调用不同的多路IO接口去判断事件是否已经被激活。
核心调用的就是epoll,同时支持poll和 select。
- 创建与销毁(父根)
// [1] create
struct event_base *event_base_new(void);
// [2] free
void event_base_free(struct event_base *base);
- 等待事件
// 循环监听,封装epoll_wait
int event_base_dispatch(struct event_base *base);
- 退出监听
// 退出循环监听
int event_base_loopexit(struct event_base *base, const struct timeval *timeout);
int event_base_loopbreak(struct event_base *base);
- 初始化节点
// 根节点 上树文件描述符fd 监听事件 回调函数cb 回调函数参数
struct event *event_new(struct event_base *base, evutil_socket_t fd, short events, event_callback_fn cb, void *arg);
// events
#define EV_TIMEOUT 0x01
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08
#define EV_PERSIST 0x10 // 设置循环监听(默认一次)
#define EV_ET 0x20
// cb
typedef void (*event_callback_fn)(evutil_socket_t fd, short, void *arg);
- 添加节点
int event_add