打造高效的工作环境Shell | 与你席地对座饮茶
Cobb 669 0

多看优秀的文章,对自己的内容不断的改进,升级! 打造高效的工作环境 – SHELL 篇 简明 VIM 练级攻略 无插件VIM编程技巧 应该知道的LINUX技巧

复用文件描述符

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    int fd1 = open("a.txt", w);
    int fd2 = open("b.txt", w);
    int fd3 = open("c.txt", w);
    std::cout << "第一次打开:"<< fd1 << std::endl;  // 3
    std::cout << "第二次打开:"<< fd2 << std::endl;  // 4
    close(fd1);
    std::cout << "第三次打开:"<< fd3 << std::endl;  // 3
}

使用过程中,前面的文件描述符被释放了,会被后面复用。

vi/vim编辑器

命令模式: x 删除光标所在字符    dd 整行删除   u 撤销     yy 复制    p 粘贴
         :32 跳到指定行数       :/key 搜索(n 下一个,N 上一个)    :set paste 进入拷贝粘贴模式         
         vim + 文件  打开文件,并跳转到最后一行(待验证)
         vim + no 文件  打开文件,并跳转到指定一行(待验证)

编辑模式:i

Vim配置 显示行号 语法高亮 智能缩进……:
    在当前用户的根目录下创建  $vi ~/.vimrc 
    具体参考:(两个一样)
        https://blog.csdn.net/sun_shine_/article/details/8449520                                         https://www.cnblogs.com/zhangyin6985/p/7111508.html

共享库和静态库

gcc 源码文件 -c    只进行预编译、编译、汇编阶段,产生.o二进制可重定位目标文件
gcc 源码文件 -o main   完成编译阶段、链接阶段,最终生成可执行文件a.out,-o可指定可执行文件的名字

# 静态库:
    g++ -c sum.cpp  => sum.o    
    ar rc libsum.a sum.o
    g++ main.cpp -lsum
(main.o 就链接 main.o + libsum.a = main 可执行文件了(文件大一点),libsum.a 是把*.o文件都打包在了一起 sum.o minor.o)
libxxx.a的文件,它是很多*.o文件的打包,链接时和主程序一起打包到可执行文件当中,运行阶段不用再搜索静态库

# 共享库: (error: ld  这是链接错误)
    g++ -fPIC -shared sum.cpp -o libsum.so

    切换到root下,要把libsum.so加入到环境变量中
    libxx.so文件,它也算是编译链接完成后的可执行文件(但和a.out普通的可执行文件执行方式不一样),主程序在链接阶段,只写入了函数在so库文件中的位置,最终生成可执行文件,运行时,调用到so库的函数,就要去找对应的libxx.so做最终的函数调用。
    可执行问文件: 经过完整的编译、链接阶段,通过./xxx可以从main函数开始执行。

# 编译链接共享库: 
     g++ -o main main.cc -lsum  (-lsum: 链接名字叫libsum.so的共享库)
     指令含义:编译main.o  链接main.o + call sum (sum函数在libsum.so中的位置信息)  => main (文件小一点)

# gcc 和 g++ 有什么区别?
gcc  *.c  *.cpp  => 如果要用c++库里面的内容 cout cin vector ,,就不能编译了,默认链接的是lib.so
g++  c++文件 => 链接的是 libstdc++.so 

备注: 堆和栈之间是 -> 共享库区域
    main2 运行起来的进程地址空间  sum =>libsum.so 找sum函数定义

配置环境变量

echo $PATH           $引用变量
~/.bash_profile      只针对当前用户生效
cource 配置文件       使刚才的配置生效

文件权限修改

三组用户:
所属用户(u)、所属同一组的其他用户(g)、不同组的其他用户(o)
所有用户(a)

chmod  u + x  对当前用户,给文件增加可执行权限
一般情况下: 目录 0644 、 文件 0755

修改文件:  chown 用户:用户组 文件          (在root下更改)
修改文件夹: chown -R 用户:用户组 文件夹    (在root下更改)

nc模拟tcp服务器/客户端

nc模拟tcp服务器: nc -l ip地址(127.0.01) 9000
nc模拟tcp客户端:nc ip地址(127.0.01) 9000
telnet ip地址 9000 模拟一个tcp客户端

netstat -tanp 查看当前系统运行的网络服务(root超户)

磁盘使用情况

df -h: 查看当前磁盘使用情况

du -h:查看当前目录及其子目录所有可统计的磁盘占用大小(比较详细)
du -hd 1:从当前目录开始算,只统计1层的目录磁盘占用大小

管道和重定向

输入(0 键盘)   输出(1 屏幕)   => 文件描述符  
              错误输出(2 屏幕)

./a.out > log.txt        标准输出,文件重定向      
./a.out > log.txt 2>&1   此时2>log.txt,但是如果是 2 > 1 ,这里的1就不是标准输出了,而是名字为1的文件

grep "关键字" 目录 -nr
grep -E "关键字1|关键字2"目录 -nr      OR关系
grep "malloc" ./ -nr|grep "sizeof"    AND关系

ls *func*  输出只有func 的,或 用管道
dev  设备 , 里面有个空 null (空洞) 相当于垃圾回收站
echo " " > XXX     #输出一个空格到某个文件==》清空

系统进程信息

ps -ef/ ps -aux :  打印系统所有进程
ps -u : 只打印当前用户运行的进程

top : 显示系统所有进程资源使用情况(进程中的线程)
top -Hp 进程pid : 此案是指定pid进程的资源使用情况

./a.out & ;在后台运行进程
kill 进程pid  杀死进程
kill -9 进程pid  结束进程

kill -l  查看linux支持的信号
man 7 signal 查看信号所有的相关信息
netstat -tanp  查看服务的

pstack 进程pid : 打印当前指定pid的函数调用栈信息
strace ./a.out  追踪文件调用的函数

# info threads  查看所有进程
# thread id 切换到指定线程进行调试(bt)

lsof 进程打开的所有文件,全部列出来

tcpdump 抓网络包

软/硬链接

l 软链接
d 目录,文件夹
c 是一种设备(打印机 扫描仪)
  空为普通文件

硬链接文件,只能给文件创建,保护文件。

常用命令(cd、ls、mv、cp、find_locate、which)

 /  根目录
./ 当前目录
./* 当前目录下的所有子目录
tail -f  实时显示(可用日志)

# 目录下存放的信息 
/usr  存放头文件、库文件……               ||||     /etc  存放系统配置文件、软件配置文件……
/var  存放系统运行 / 软件运行的日志……     ||||     /root 是Linux root超级用户
/home admin、xiaoma……

pwd 查看当前目录的绝对路径
ls -a : 查看隐藏文件
ls -i : 查看详细的目录信息 简写 ll
ll -i => ls -il : 各个文件/文件夹的inode索引号和引用数量

cp -r 源文件夹  目标路径  => 拷贝文件夹

# 搜索:
find 路径 -name "poll.h"         实时搜索,查系统目录在root下
locate 文件名        从系统周期性生成db数据库文件里搜索,默认是7天更新一下数据库。
which   搜命令      (如果要搜系统路径,先进入root超户)
whereis    在PATH变量中查找,程序名,二进制,man说明文件以及源代码文件


文件:
.  当前目录
..  上一级目录

文件:
tail -f XXX.log  #动态显示文本的最新内容
tail -10 file
head -10 file

关闭防火墙

root下执行systemctl stop firewalld.service关闭防火墙

查看 .o 文件信息

// 只编译生成main.o文件

// 查看segment的信息 text data
objdump -s main.o

// 查看符号表
objdump -t main.o

// 把符号还原成函数声明信息
c++filt _Z3sumii

echo $?    查看进程的exit退出码
评论区

索引目录