Linux应用程序开发经验

1、学会使用Linux

1.1 熟练掌握命令行环境

• 要学会Linux编程,必须得先学会用Linux,也就是要在Linux命令行环境下“生存”下来
• 给一台主机,能够在上面装一个操作系统(比如Ubuntu18.04或者其他版本)
• 给一台Linux服务器,能够熟练地用起来
• 或者在Win10下,熟练使用WSL2
• 安装WSL2
• 基于WSL2环境下安装ubuntu 16.04,或ubuntu 18.04
• 基于WSL2+ubuntu,搭建应用程序的交叉编译环境
• 什么叫熟练地用起来?原来在Windows上干啥,在Linux上也能干:
• 新建文件,查看文件,编辑文件,保存文件,复制,移动,删除,打包,解压,联网……
• 下载软件,安装软件,不仅要熟练掌握apt-get,yum之类的软件包管理工具,还要能从源码编译、安装
• 常用命令:chmod, chown, passwd, cat, more, cd , ps , top, dmesg等等
• 插入一个U盘,如何挂载这个U盘,操作U盘下的文件
• vim基本操作:编辑模式,写入,保存,退出,光标移动……
• docker基本操作,能够利用docker处理一些日常工作,比如程序编译
• ……
• 另外要熟悉Linux下的文件系统,每个目录是干啥的,目录下的文件是干嘛的:

  • /etc
  • /proc
  • /sys
  • /usr
  • /var
  • /sbin
  • /lib
  • /dev
  • ……

• 推荐《鸟哥的Linux私房菜-基础篇》,记得是基础篇,记得安装Linux系统自己操作一遍
• 还有一本是服务器篇,既然是要学Linux编程开发,可先不用看服务器架设篇

2、Linux应用程序开发

2.1 Linux C/C++应用程序开发

2.1.1 要点

• Linux的API是遵循POSIX标准的,可自行搜索学习什么叫POSIX。
• Linux下文件操作,这个很重要,你要知道Linux下的一个思想叫一切皆文件,可见文件读写多重要了
• I/O模型,五大I/O模型,阻塞,非阻塞,复用,信号驱动和异步I/O,环环相扣丝丝相连,概念和操作都要仔细琢磨
• 最重要的当属复用,就是select,poll和epoll,要知道他们的适用范围和优缺点
• 进程和线程,包括进程和线程的概念和区别,进程和线程的建立,同步,通信,互斥等等
• 网络编程,就是socket编程,这个学不好等于啥都没学
• 还得了解一下TCP/IP协议,socket,bind,listen,accept……
• 要熟悉种常见的服务器模型,进程池线程池方式的,多进程方式的,复用方式的,最重要的是复用方式的,这部分可以先只写服务器,测试直接用Telnet
• 数据库,这个东西不属于Linux,但是还得会,要不然啥都做不了,推荐《MySQL必知必会》
• Makefile的编写,重点学习CMake
• 编译和链接原理,掌握静态库,动态库等基本概念

2.1.2 推荐的书籍

• C语言:推荐《c语言程序设计》(丹尼斯.里奇)、《Linux C编程一站式学习》
• C++:推荐《Essential C++》、《C++ Primer》、《Effective C++》、《C++并发编程实战》等
• 《Unix环境高级编程》(W.Richard.Stevens)
• 《Unix网络编程》 两部,(W.Richard.Stevens)
• 《Unix/Linux编程实践教程》,(Bruce Molay)
• 《Linux网络编程》 宋劲彬
• 《Linux高级程序设计》 华清远见
• 《MySQL必知必会》
• 《数据库系统概念》
• 《大话数据结构》
• 《算法导论》

2.2 Linux Shell脚本开发

2.2.1 要点

• Linux的基础要尽可能好。Shell编程其实就是将Linux命令进行组装,配合shell script的一些逻辑实现更复杂的功能。所以要想写出厉害的shell script,Linux基础太重要了。基础命令如ls、cd、pwd、echo、ps等这些不用说,用户、组、文件权限(755)、设备(/dev/null)、管道命令(|)、隐藏文件权限(4755?)、服务这些都要熟悉。
• Linux基础不太好的话推荐《鸟哥的Linux私房菜 基础篇》,前十章要看完并且动手操作一遍,整本书都能啃完自然最好。
• Shell Script的基本语法要熟练。鸟哥Linux私房菜第十章就是在讲Shell基础,这里面讲的东西看完,代码敲一遍,习题做完,基础就够用了。
• 正则表达式要会灵活运用。grep、sed、awk这些命令实在是太重要了,配合正则表达式,可以极大提高shell脚本的质量。
• 最重要的还是要多写多练。既然要用shell script,那这是个很好的锻炼shell编程的机会。
• 遇到问题了多Google、百度,多在命令行下面试。
• 平时在工作过程中发现有些经常做的事情,重复性很高,比如天天都要pull代码,那就可以考虑写shell script来做自动化。

2.2.2 推荐的书籍

• 想要深入研究shell script的话,可以看看这本书:《Linux Command Line and Shell Scripting Bible》,中文名叫做: 《Linux命令行与shell脚本编程大全》。

2.3 Linux C/C++开发环境

• 基于Ubuntu 18.04(或以上版本)的C/C++开发环境
• vscode
• gcc,gdb,cmake,ninja
• 基于Win10+WSL2+vscode的C/C++开发环境
• 基于Win10+Vscode ssh remote+Linux服务器的C/C++开发环境

2.4 进阶学习

• 看看Linux内核源码,了解Linux内核的进线程调度等原理
• 学习和了解计算机网络,操作系统原理等,知其所以然
• 在学习的过程中,要不断积累和了解最新的东西,最起码要知道个概念,比如分布式,大数据,云计算,机器学习,计算机视觉,JIT等等,形成知识链
• 学一学python,用python完成一些shell脚本实现的功能

3、Linux程序调试技巧

在Linux下的用户空间调试工具主要有系统工具和专门调试工具:‘print’ 打印语句,这是新手最常用的;查询 (/proc, /sys 等)系统的虚拟文件查看,这个方法有局限性;跟踪 (strace/ltrace)工具使用这个比较普遍,值得提倡;Valgrind (memwatch)内存排除工具,在内存排除方面比较独到,是内存排错的法宝;GDB大名鼎鼎的程序调试工具,这个是个全能的工具,没有完不成的,只有你不知道的。

3.1 ‘print’ 打印日志

这是一个基本的调试问题的方法。 我们在程序中怀疑的地方插入printf(syslog,或者其他打印日志手段)语句来了解程序的运行流程控制流和变量值的改变。 这是一个最简单的技术, 它的缺点。 需要进行程序编辑,添加’print’语句,必须重新编译,重新运行来获得输出。若需要调试的程序比较大,这将是一个耗时费力的方法。

3.2 查询系统信息

在某些情况下,我们需要弄清楚在一个运行在内核中的进程的状态和内存映射。为了获得这些信息,我们不需要在内核中插入任何代码。 相反,可以用 /proc 文件系统。在/proc的伪文件系统,保留系统启动运行就收集的运行时信息 (cpu信息, 内存容量等)。
ls -l /proc’的输出结果,通过对 系统中运行的每一个进程在/proc文件系统中有一个以进程id命名的项。每个进程的细节信息可以在进程id对应的目录下的文件中获得。也可以’ls /proc/pid’的输出
解释/proc文件系统内的所有条目超出了本文的范围。一些有用的列举如下:

• /proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关
• /proc/cmdline 启动时传递给kernel的参数信息
• /proc/cpuinfo cpu的信息
• /proc/crypto 内核使用的所有已安装的加密密码及细节
• /proc/devices 已经加载的设备并分类
• /proc/execdomains Linux内核当前支持的execution domains
• /proc/filesystems 内核当前支持的文件系统类型
• /proc/interrupts 架构中的每个IRQ中断数
• /proc/iomem 每个物理设备当前在系统内存中的映射
• /proc/ioports 一个设备的输入输出所使用的注册端口范围
• /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理
• /proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关
• /proc/locks 内核锁住的文件列表
• /proc/meminfo RAM使用的相关信息
• /proc/misc 其他的主要设备(设备号为10)上注册的驱动
• /proc/modules 所有加载到内核的模块列表
• /proc/mounts 系统中使用的所有挂载
• /proc/partitions 分区中的块分配信息
• /proc/slabinfo 系统中所有活动的 slab 缓存信息
• /proc/stat 所有的CPU活动信息
• /proc/uptime 系统已经运行了多久
• /proc/swaps 交换空间的使用情况
• /proc/version Linux内核版本和gcc版本
• /proc/bus 系统总线(Bus)信息,例如pci/usb等
• /proc/driver 驱动信息
• /proc/fs 文件系统信息
• /proc/irq 中断请求设备信息
• /proc/net 网卡设备信息
• /proc/scsi scsi设备信息
• /proc/tty tty设备信息
• /proc/net/dev 显示网络适配器及统计信息
• /proc/vmstat 虚拟内存统计信息
• /proc/vmcore 内核panic时的内存映像
• /proc/diskstats 取得磁盘信息
• /proc/sched_debug kernel调度器的统计信息
• /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用
以下是/proc目录中进程N的信息:
• /proc/N pid为N的进程信息
• /proc/N/cmdline 进程启动命令
• /proc/N/cwd 链接到进程当前工作目录
• /proc/N/environ 进程环境变量列表
• /proc/N/exe 链接到进程的执行命令文件
• /proc/N/fd 包含进程相关的所有的文件描述符
• /proc/N/maps 与进程相关的内存映射信息
• /proc/N/mem 指代进程持有的内存,不可读
• /proc/N/root 链接到进程的根目录
• /proc/N/stat 进程的状态
• /proc/N/statm 进程使用的内存的状态
• /proc/N/status 进程状态信息,比stat/statm更具可读性
• /proc/self 链接到当前正在运行的进程

一个常用的例子是通过/proc/tty/drivers下的文件接口,查看串口的工作状态:

[root@buildroot(V8133L) ~]# cat /proc/tty/driver/*
serinfo:1.0 driver revision:
0: uart:16550A mmio:0x54E00000 irq:7 tx:7011 rx:207 oe:1 RTS|DTR
1: uart:16550A mmio:0x57100000 irq:13 tx:2800 rx:38006 RTS|DTR
2: uart:16550A mmio:0x56B00000 irq:12 tx:1442 rx:2275 RTS|DTR
3: uart:16550A mmio:0x55100000 irq:9 tx:103361 rx:102977 RTS|DTR
4: uart:16550A mmio:0x55000000 irq:8 tx:102977 rx:103343 RTS|DTR
5: uart:16550A mmio:0x55200000 irq:10 tx:103791 rx:102844 RTS|CTS|DTR
6: uart:16550A mmio:0x56A00000 irq:11 tx:103481 rx:103791 RTS|DTR
usbserinfo:1.0 driver:2.0

3.3 跟踪

strace的和ltrace是两个在Linux中用来追踪程序的执行细节的跟踪工具。

3.3.1 strace

strace拦截和记录系统调用及其接收的信号。对于用户,它显示了系统调用、传递给它们的参数和返回值。strace的可以附着到已在运行的进程或一个新的进程。它作为一个针对开发者和系统管理员的诊断、调试工具是很有用的。它也可以用来当做一个通过跟踪不同的程序调用来了解系统的工具。这个工具的好处是不需要源代码,程序也不需要重新编译。

3.3.2 ltrace

ltrace跟踪和记录一个进程的动态(运行时)库的调用及其收到的信号。它也可以跟踪一个进程所作的系统调用。它的用法类似与strace。

3.4 Valgrind

Valgrind是一套调试和分析工具。它的一个被广泛使用的默认工具——‘Memcheck’——可以拦截malloc(),new(),free()和delete()调用。换句话说,它在检测下面这些问题非常有用:
• 内存泄露
• 重释放
• 访问越界
• 使用未初始化的内存
• 使用已经被释放的内存等。
它直接通过可执行文件运行。
• Valgrind也有一些缺点,因为它增加了内存占用,会减慢你的程序。它有时会造成误报和漏报。它不能检测出静态分配的数组的访问越界问题。
• Valgrind目前对ARM平台的支持并不好

3.5 gdb/gdbserver

GDB是来自自由软件基金会的调试器。它对定位和修复代码中的问题很有帮助。当被调试的程序运行时,它给用户控制权去执行各种动作, 比如:
• 启动程序
• 停在指定位置
• 停在指定的条件
• 检查所需信息
• 改变程序中的数据 等。
也可以将一个崩溃的程序coredump附着到GDB并分析故障的原因。
还可通过gdb+gdbserver来调试,gdbserver在目标系统中运行,gdb则在宿主机上运行。

3.6 ipcs 查询进程间通信状态

ipcs是Linux下显示进程间通信设施状态的工具。可以显示消息队列、共享内存和信号量的信息。对于程序员非常有用,普通的系统管理员一般用不到此指令。

$ipcs

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 229376     weber      600        1

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

$ipcs -m 查看系统使用的IPC共享内存资源
$ipcs -q 查看系统使用的IPC队列资源
$ipcs -s 查看系统使用的IPC信号量资源

3.7 lsof 一切皆文件

lsof(list open files)是一个查看当前系统文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。
lsof打开的文件可以是:

  1. 普通文件
  2. 目录
  3. 网络文件系统的文件
  4. 字符或设备文件
  5. (函数)共享库
  6. 管道,命名管道
  7. 符号链接
  8. 网络文件(例如:NFS file、网络socket,unix域名socket)
  9. 还有其它类型的文件,等等
$lsof| more
COMMAND     PID      USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init          1      root  cwd       DIR              253,0     4096          2 /
init          1      root  rtd       DIR              253,0     4096          2 /
init          1      root  txt       REG              253,0   150352    1310795 /sbin/init
init          1      root  mem       REG              253,0    65928    5505054 /lib64/libnss_files-2.12.so
init          1      root  mem       REG              253,0  1918016    5521405 /lib64/libc-2.12.so
init          1      root  mem       REG              253,0    93224    5521440 /lib64/libgcc_s-4.4.6-20120305.so.1
init          1      root  mem       REG              253,0    47064    5521407 /lib64/librt-2.12.so
init          1      root  mem       REG              253,0   145720    5521406 /lib64/libpthread-2.12.so
...

3.8 ps 进程查看器

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。
要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。

3.9 top linux下的任务管理器

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。

$top
    top - 09:14:56 up 264 days, 20:56,  1 user,  load average: 0.02, 0.04, 0.00
    Tasks:  87 total,   1 running,  86 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.2%st
    Mem:    377672k total,   322332k used,    55340k free,    32592k buffers
    Swap:   397308k total,    67192k used,   330116k free,    71900k cached
    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    1 root      20   0  2856  656  388 S  0.0  0.2   0:49.40 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S  0.0  0.0   7:15.20 ksoftirqd/0
    4 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0

• 第一行
• 09:14:56 : 系统当前时间
• 264 days, 20:56 : 系统开机到现在经过了多少时间
• 1 users : 当前2用户在线
• load average: 0.02, 0.04, 0.00: 系统1分钟、5分钟、15分钟的CPU负载信息
• 第二行
• Tasks:任务;
• 87 total:很好理解,就是当前有87个任务,也就是87个进程。
• 1 running:1个进程正在运行
• 86 sleeping:86个进程睡眠
• 0 stopped:停止的进程数
• 0 zombie:僵死的进程数
• 第三行
• Cpu(s):表示这一行显示CPU总体信息
• 0.0%us:用户态进程占用CPU时间百分比,不包含renice值为负的任务占用的CPU的时间。
• 0.7%sy:内核占用CPU时间百分比
• 0.0%ni:改变过优先级的进程占用CPU的百分比
• 99.3%id:空闲CPU时间百分比
• 0.0%wa:等待I/O的CPU时间百分比
• 0.0%hi:CPU硬中断时间百分比
• 0.0%si:CPU软中断时间百分比
• 注:这里显示数据是所有cpu的平均值,如果想看每一个cpu的处理情况,按1即可;折叠,再次按1;
• 第四行
• Men:内存的意思
• 8175320kk total:物理内存总量
• 8058868k used:使用的物理内存量
• 116452k free:空闲的物理内存量
• 283084k buffers:用作内核缓存的物理内存量
• 第五行
• Swap:交换空间
• 6881272k total:交换区总量
• 4010444k used:使用的交换区量
• 2870828k free:空闲的交换区量
• 4336992k cached:缓冲交换区总量
• 进程信息
• PID:进程的ID
• USER:进程所有者
• PR:进程的优先级别,越小越优先被执行
• NInice:值
• VIRT:进程占用的虚拟内存
• RES:进程占用的物理内存
• SHR:进程使用的共享内存
• S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
• %CPU:进程占用CPU的使用率
• %MEM:进程使用的物理内存和总内存的百分比
• TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
• COMMAND:进程启动命令名称
3.10、 free 查询可用内存
free工具用来查看系统可用内存:
[root@buildroot(V8133L) ~]# free
total used free shared buff/cache available
Mem: 511724 24548 431356 72 55820 481412
Swap: 0 0

第一列
Mem 内存的使用信息
Swap 交换空间的使用信息
第一行
total 系统总的可用物理内存大小
used 已被使用的物理内存大小
free 还有多少物理内存可用
shared 被共享使用的物理内存大小
buff/cache 被 buffer 和 cache 使用的物理内存大小
available 还可以被 应用程序 使用的物理内存大小
free 与 available 的区别
free 是真正尚未被使用的物理内存数量。
available 是应用程序认为可用内存数量,available = free + buffer + cache (注:只是大概的计算方法)
Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。这就是稍后要说明的 buffer 和 cache。
Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么cached memory比较大,而free比较小的原因。

4、其他常用的命令和工具

4.1 stty

stty命令用于显示和修改终端行设置(change and print terminal line settings)。
stty常用来查看或者修改串口的设置。
比如查看串口/dev/ttyS3的设置:

[root@buildroot(V8133L) ~]# stty -a -F /dev/ttyS3
speed 9600 baud;stty: /dev/ttyS3
 line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>;
eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>;
stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>;
lnext = <undef>; flush = <undef>; min = 255; time = 4;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon
-ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0
ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop
-echoprt -echoctl -echoke -flusho -extproc

修改串口/dev/ttyS3的波特率为9600
stty -F /dev/ttyS3 9600

4.2 dmesg

Linux dmesg(英文全称:display message)命令用于显示开机信息。
kernel 会将开机信息存储在 ring buffer 中。您若是开机时来不及查看信息,可利用 dmesg 来查看。

[root@buildroot(V8133L) ~]# dmesg | more
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.14.155-gac856fcaf (root@lme-server1) (gcc version 7.4.1 20181213 [linaro-7.4-2019.02 revision 56ec6f6b99cc167ff0c2f8e1a2eed33b1edc85d4] (Linaro GCC 7.4-2019.02)) #V1.0.0 20220119
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c53c7d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: leo
[    0.000000] earlycon: uart8250 at MMIO32 0x54e00000 (options '')
[    0.000000] bootconsole [uart8250] enabled
[    0.000000] Memory policy: Data cache writeback
[    0.000000] On node 0 totalpages: 131072
[    0.000000] free_area_init_node: node 0, pgdat c0779e10, node_mem_map dfbf0000
[    0.000000]   Normal zone: 1024 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 131072 pages, LIFO batch:31
[    0.000000] CPU: All CPU(s) started in SVC mode.
[    0.000000] platform_i2s_init: pll3 locked
[    0.000000] platform_lcdc_init: pll5 locked
[    0.000000] platform_sdhci_init: pll7 locked
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
--More-- 

4.3 netstat

显示各种网络相关信息,如网络连接(无参数),路由表(-r)等网络信息。

[root@buildroot(V8133L) ~]# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:ftp             0.0.0.0:*               LISTEN      
netstat: /proc/net/tcp6: No such file or directory
udp        0      0 0.0.0.0:4060            0.0.0.0:*                           
udp        0      0 0.0.0.0:4061            0.0.0.0:*                           
udp        0      0 0.0.0.0:4066            0.0.0.0:*                           
udp        0      0 0.0.0.0:4067            0.0.0.0:*                           
udp        0      0 0.0.0.0:4069            0.0.0.0:*                           
udp        0      0 0.0.0.0:4070            0.0.0.0:*                           
netstat: /proc/net/udp6: No such file or directory
netstat: /proc/net/raw6: No such file or directory
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  17     [ ]         DGRAM                      3728 /dev/log
unix  2      [ ]         DGRAM                      3962 
unix  2      [ ]         DGRAM                      3903 
unix  2      [ ]         DGRAM                      4180 
unix  2      [ ]         DGRAM                      4183 
unix  2      [ ]         DGRAM                      4207 
unix  2      [ ]         DGRAM                      4019 
unix  2      [ ]         DGRAM                      3997 
unix  2      [ ]         DGRAM                      4102 
unix  2      [ ]         DGRAM                      4101 
unix  2      [ ]         DGRAM                      3967 
unix  2      [ ]         DGRAM                      3970 
unix  2      [ ]         DGRAM                      3971 
unix  2      [ ]         DGRAM                      3956 
unix  2      [ ]         DGRAM                      3963 
unix  2      [ ]         DGRAM                      5125 
[root@buildroot(V8133L) ~]# 

4.4 route命令

Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table)。
查看路由:

root@OpenWrt:/# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.2.1     0.0.0.0         UG    0      0        0 eth0
default         192.168.2.1     0.0.0.0         UG    0      0        0 eth0
192.168.2.0     *               255.255.255.0   U     0      0        0 eth0

增加一条路由:

route add -net $HOSTIP netmask 255.255.255.0 gw $GWIP ppp0

5、参考资料

  1. Linux基础,https://linuxtools-rst.readthedocs.io/zh_CN/latest/base/index.html
  2. Linux工具进阶,https://linuxtools-rst.readthedocs.io/zh_CN/latest/advance/index.html
  3. 鸟哥的Linux私房菜:基础学习篇,http://cn.linux.vbird.org/linux_basic/linux_basic.php

你可能感兴趣的:(linux,linux,ubuntu,服务器)