From cf4b2cb324b33b38b37e3d5fed0a59bba72c4f06 Mon Sep 17 00:00:00 2001 From: rangersly <2281598291@qq.com> Date: Fri, 9 May 2025 18:07:44 +0800 Subject: [PATCH] FIX: merge gcc_g++ create shared lib FIX: C in linux read KEY FIX: .bashrc echo DIR FIX: gcc_g++ create shared lib --- os/linux/config/.bashrc | 23 ++++---- program/c_cpp/linux/key.c | 59 +++++++++++++++++++ program/c_cpp/linux/keys.cpp | 41 ------------- program/c_cpp/universal/compile.md | 3 +- .../universal/{c_string.md => cstring.md} | 6 +- program/c_cpp/universal/fast.md | 4 +- program/c_cpp/universal/func.md | 18 ------ program/c_cpp/universal/io.md | 26 ++++---- program/tool/gcc_g++.md | 16 ++--- tool/vim/shortcutKeys.md | 22 +++---- 10 files changed, 105 insertions(+), 113 deletions(-) create mode 100644 program/c_cpp/linux/key.c delete mode 100644 program/c_cpp/linux/keys.cpp rename program/c_cpp/universal/{c_string.md => cstring.md} (90%) diff --git a/os/linux/config/.bashrc b/os/linux/config/.bashrc index 5bb87fa..eb2a910 100644 --- a/os/linux/config/.bashrc +++ b/os/linux/config/.bashrc @@ -4,8 +4,8 @@ [[ $- != *i* ]] && return # 历史记录配置 -HISTSIZE=5000 # 内存中保存的历史记录数量 -HISTFILESIZE=5000 # 历史文件最大行数 +HISTSIZE=10000 # 内存中保存的历史记录数量 +HISTFILESIZE=10000 # 历史文件最大行数 HISTCONTROL=ignoreboth # 忽略重复命令和空格开头的命令 shopt -s histappend # 追加历史而不是覆盖 @@ -27,9 +27,9 @@ alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto' # 更详细的ls别称 -alias ll='ls -alFh --group-directories-first' +alias l='ls -alFh --group-directories-first' alias la='ls -A' -alias l='ls -CF' +# alias l='ls -CF' # PS1提示符 @@ -64,12 +64,12 @@ parse_git_branch() { # 处理路径:长路径时只保留每级目录首字母 local DIR=${PWD/#$HOME/\~} - if [ ${#DIR} -gt 25 ]; then + if [ ${#DIR} -gt 30 ]; then DIR=$(echo $DIR | awk -F '/' '{ - if (length($0) > 20) { + if (length($0) > 30) { for (i=1; i<=NF; i++) { - if (i == NF) printf "/%s", $i; - else if (length($i) > 0) printf "/%.2s", $i; + if (i == NF) printf "%s", $i; + else printf "%.3s/", $i; } } else print $0; @@ -93,14 +93,13 @@ parse_git_branch() { PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ ' # 安全操作确认 -alias rm='rm -i' -alias cp='cp -i' -alias mv='mv -i' +alias rr='rm -i' +#alias cp='cp -i' +#alias mv='mv -i' # 快速导航 alias ..='cd ..' alias ...='cd ../..' -alias ....='cd ../../..' alias ~='cd ~' # 网络相关 diff --git a/program/c_cpp/linux/key.c b/program/c_cpp/linux/key.c new file mode 100644 index 0000000..ddaa24e --- /dev/null +++ b/program/c_cpp/linux/key.c @@ -0,0 +1,59 @@ +#include +#include +#include + +static struct termios original; + +void enable_raw_mode() { + tcgetattr(STDIN_FILENO, &original); + struct termios raw = original; + raw.c_lflag &= ~(ICANON | ECHO); + raw.c_cc[VMIN] = 0; + raw.c_cc[VTIME] = 1; + tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw); +} + +void disable_raw_mode() { + tcsetattr(STDIN_FILENO, TCSAFLUSH, &original); +} + +int kbhit() { + char ch; + int n = read(STDIN_FILENO, &ch, 1); + if (n == 1) return ch; + return -1; +} + +int main() { + enable_raw_mode(); + atexit(disable_raw_mode); // 确保程序退出时恢复终端 + + printf("Press 'q' to quit\n"); + while (1) { + int key = kbhit(); + if (key != -1) { + printf("Key: %c (0x%02x)\n", key, key); + if (key == 'q') break; + } + + // 在这里添加逻辑 + usleep(10000); // 10ms延迟减少CPU占用 + } + + return 0; +} +// struct termios +// { +// tcflag_t c_iflag; /* input mode flags */ +// tcflag_t c_oflag; /* output mode flags */ +// tcflag_t c_cflag; /* control mode flags */ +// tcflag_t c_lflag; /* local mode flags */ +// cc_t c_line; /* line discipline */ +// cc_t c_cc[NCCS]; /* control characters */ +// speed_t c_ispeed; /* input speed */ +// speed_t c_ospeed; /* output speed */ +// #define _HAVE_STRUCT_TERMIOS_C_ISPEED 1 +// #define _HAVE_STRUCT_TERMIOS_C_OSPEED 1 +// }; + + diff --git a/program/c_cpp/linux/keys.cpp b/program/c_cpp/linux/keys.cpp deleted file mode 100644 index 62558a7..0000000 --- a/program/c_cpp/linux/keys.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include - -using namespace std; - -int key() { - // struct termios - // { - // tcflag_t c_iflag; /* input mode flags */ - // tcflag_t c_oflag; /* output mode flags */ - // tcflag_t c_cflag; /* control mode flags */ - // tcflag_t c_lflag; /* local mode flags */ - // cc_t c_line; /* line discipline */ - // cc_t c_cc[NCCS]; /* control characters */ - // speed_t c_ispeed; /* input speed */ - // speed_t c_ospeed; /* output speed */ - // #define _HAVE_STRUCT_TERMIOS_C_ISPEED 1 - // #define _HAVE_STRUCT_TERMIOS_C_OSPEED 1 - // }; - unsigned char in; - struct termios new_settings, old_settings; - tcgetattr(STDIN_FILENO,&old_settings); //获得stdin 输入 - new_settings = old_settings; - new_settings.c_lflag &= (~ICANON); -// new_settings.c_cc[VTIME] = 0; -// tcgetattr(STDIN_FILENO,&old_settings); //获得stdin 输入 -// new_settings.c_cc[VMIN] = 1; - tcsetattr(STDIN_FILENO,TCSANOW,&new_settings); // - - in = getchar(); - - tcsetattr(STDIN_FILENO,TCSANOW,&old_settings); - return in; -} - -int main() { - while(1) - printf(" %d \n", key()); - return 0; -} diff --git a/program/c_cpp/universal/compile.md b/program/c_cpp/universal/compile.md index 82f1b61..68806af 100644 --- a/program/c_cpp/universal/compile.md +++ b/program/c_cpp/universal/compile.md @@ -3,7 +3,7 @@ ## 目录 - [define](#define) - [预定义宏](#预定义宏) - - [defined](# defined) + - [defined](#defined) - [ifdef](#ifdef) - [ifndef](#ifndef) - [undef](#undef) : 若要修改一个宏,先移除再定义 @@ -51,5 +51,6 @@ --- ## pragma +由编译器定义的预处理指令,若不支持则无操作 `#pragma once` 确保头文件只被包含一次 diff --git a/program/c_cpp/universal/c_string.md b/program/c_cpp/universal/cstring.md similarity index 90% rename from program/c_cpp/universal/c_string.md rename to program/c_cpp/universal/cstring.md index 453e505..cda2665 100644 --- a/program/c_cpp/universal/c_string.md +++ b/program/c_cpp/universal/cstring.md @@ -5,9 +5,9 @@ ## INDEX -- [字符串库函数](# std-string) -- [内存操作标准库函数](# std-mem) -- [与string容器转换](# to-string) +- [字符串库函数](#std-string) +- [内存操作标准库函数](#std-mem) +- [与string容器转换](#to-string) --- diff --git a/program/c_cpp/universal/fast.md b/program/c_cpp/universal/fast.md index 6c5296e..ee7d549 100644 --- a/program/c_cpp/universal/fast.md +++ b/program/c_cpp/universal/fast.md @@ -2,15 +2,13 @@ + 使用const关键字 + 避免频繁进行内存分配和释放 + 尽量减少值传递,多用引用来传递参数 - + 局部变量VS静态变量(多次调用局部更快,因为局部变量可以读入寄存器,静态不行) + + 局部变量VS静态变量(多次调用可能局部更快) + ++i和i++的效率问题(使用迭代器可能比使用指针更优:迭代器++i可以减少一次构造和析构) + 避免使用多重继承 + 低级代码使用位运算替代算术运算 - + 使用编译器自带的优化选项 + 将小粒度函数声明为内联函数(inline) + 循环内定义,还是循环外定义对象:由构造函数和复制操作的效率比较决定 + 小函数放在同一循环内效率高,大函数分开放效率更高(由cpu寄存器决定) + 尽量少使用`dynamic_cast` + 减少除法运算的使用,除数尽量使用常量,让编译器优化 + 多用直接初始化 - + 循环展开加速 diff --git a/program/c_cpp/universal/func.md b/program/c_cpp/universal/func.md index cb6f9c7..84262ae 100644 --- a/program/c_cpp/universal/func.md +++ b/program/c_cpp/universal/func.md @@ -4,7 +4,6 @@ - [extern](#extern) - [noexcept](#noexcept) - [重载](#) -- [often](#often) ## extern @@ -28,20 +27,3 @@ noexcept 的一个重要用途是优化性能,特别是在移动语义中。 + const左值:选择const T&。 + 右值:优先选择T&&, else const T& + 字面量或临时对象:选择T&&。 - -## often - -``` -abs(x); //求x的绝对值 e.g.abs(-5)=5 -fabs() //实数绝对值 -exp(x); //求x的自然指数e^x e.g.exp(1)=2.718282 -floor(x); //向下取整 -ceil(x); //向上取整 -log(x); //求实数x的自然数对数 e.g.log(1)=0 -pow(x,y); //计算x^y,输出为双精度实数 e.g.pow(2,3)=8 -sqrt(x); //求x的平方根 e.g.sqrt(25)=5 -strlen(str);获取字符数组长度(只能用在字符数组)。 -max(a,b) //两数中最大 -min(a,b) //两数中最小 -swap(a,b) //交换两个类型相同的变量 -``` diff --git a/program/c_cpp/universal/io.md b/program/c_cpp/universal/io.md index 453137f..cd326e4 100644 --- a/program/c_cpp/universal/io.md +++ b/program/c_cpp/universal/io.md @@ -1,20 +1,20 @@ # c with cpp io -# 目录 +# INDEX -- [标准IO流](# IOstream) -- [C](# C) - - [格式化IO](# 格式化IO) - - [字符IO](# charIO) - - [Cstring](# Cstring) - - [C二进制IO](# Cbin) - - [C文件操作](# C-FILE) - - [error](# c-error) -- [cpp stdio](# cpp stdio) -- [cpp fio](# cpp fio) -- [关闭缓冲区读取](# ../linux/ncurses.c) -- [ANSI](# ./ansi.md) +- [标准IO流](#IOstream) +- [C](#C) + - [格式化IO](#格式化IO) + - [字符IO](#charIO) + - [Cstring](#Cstring) + - [C二进制IO](#Cbin) + - [C文件操作](#C-FILE) + - [error](#c-error) +- [cpp stdio](#cpp stdio) +- [cpp fio](#cpp fio) +- [关闭缓冲区读取](#../linux/ncurses.c) +- [ANSI](#./ansi.md) --- diff --git a/program/tool/gcc_g++.md b/program/tool/gcc_g++.md index 21f6ace..bdd16e6 100644 --- a/program/tool/gcc_g++.md +++ b/program/tool/gcc_g++.md @@ -76,14 +76,8 @@ g++ -o main -l库名 -L库路径 -I头文件路径 // g++ -o main -ltest -L/home/e0x1a/test -#### `-rpath 是 GNU 链接器的一个选项,它会在可执行文件中嵌入运行时库搜索路径` -`gcc -o myapp myapp.c -L../libs -lmylib -Wl,--enable-new-dtags,-rpath,'$ORIGIN/../libs'` -``` --Wl,-rpath,/path/to/libs: - -Wl 告诉 GCC 将后面的参数传递给链接器 - -rpath 是链接器选项 - /path/to/libs 是要嵌入的运行时搜索路径 -``` - - 如果是动态库,需要指定 `LD_LIBRARY_PATH` 环境变量 //待查 - 用 `echo $LD_LIBRARY_PATH` 查看 +#### 编译主程序时链接动态库 +- `gcc -o myprogram main.c -L. -lmylib -Wl,-rpath=.` + - `-L.` 告诉编译器在当前目录中查找动态库文件 + - `-lmylib` 链接名为 libmylib.so 的动态库 + - `-Wl,-rpath=.` 将运行时路径嵌入到可执行文件中,强制程序运行时优先从当前目录加载动态库 diff --git a/tool/vim/shortcutKeys.md b/tool/vim/shortcutKeys.md index 7d87cc7..5bcf0b6 100644 --- a/tool/vim/shortcutKeys.md +++ b/tool/vim/shortcutKeys.md @@ -2,17 +2,17 @@ `.` 重复上一个操作 ## 目录 -- [录制宏](# 录制宏) -- [打开终端](# 打开终端) -- [快捷键](# 快捷键) - - [移动](# 移动) - - [插入](# 插入) - - [修改](# 修改) - - [删除](# 删除) - - [复制](# 复制) -- [基本补全](# 基本补全) - - [补全菜单](# 补全菜单) -- [vimrc](# ./.vimrc) +- [录制宏](#录制宏) +- [打开终端](#打开终端) +- [快捷键](#快捷键) + - [移动](#移动) + - [插入](#插入) + - [修改](#修改) + - [删除](#删除) + - [复制](#复制) +- [基本补全](#基本补全) + - [补全菜单](#补全菜单) +- [vimrc](#./.vimrc) ## 录制宏 使用 q[Key] 开始录制宏,再次点击q结束录制