资讯详情

简历技术栈全面复习——Linux / 操作系统

📅 2026/9/28 5:29:07 | 华诺云谱 👁 阅读
简历技术栈全面复习——Linux / 操作系统
1、SSH 场景你简历中明确写了EtherCAT 任务本地/SSH 执行。例如你的开发电脑 │ │ SSH ↓ 机器人/远程PC │ ↓ 执行控制程序SSH 登录以后./robot_control实际上就是执行./robot_control默认情况下终端 ↓ robot_control程序占着这个终端。如果程序持续运行robot_control robot_control robot_control ...你可能无法直接继续使用当前终端。如果放到后台./robot_control 可以理解成终端 │ ├── 继续接受命令 │ └── robot_control ↓ 后台运行但真正的工程部署通常不会简单依靠。后面我们会学习systemd让 Linux 自动启动 ↓ 运行 ↓ 异常重启 ↓ 记录日志 ↓ 停止这就会进入真正的工程部署。C源代码 ↓ g ↓ 可执行文件 ↓ ./program ↓ Linux创建进程 ↓ PID ↓ 进程创建线程 ↓ 线程执行任务而你的机器人程序就是C代码 ↓ 编译 ↓ robot_control ↓ Linux进程 ↓ Receive Thread ↓ GMR Thread ↓ Send Thread ↓ UDP / ZMQ / EtherCAT这才是你真正应该建立的 Linux 思维。2、Linux/etc这里主要放系统和各种程序的配置文件。系统配置 程序配置 服务配置 网络配置/usr可以先粗略理解成系统安装的软件、程序、库等。/var这里主要放运行过程中经常变化的数据。例如/var/log就是非常重要的日志目录/tmp临时文件。例如程序运行时产生临时数据 临时文件 中间文件通常放这里。/devLinux 的设备文件。/opt这个目录在工程部署里也比较常见。可以放程序 配置 库 脚本你以后做机器人软件部署很可能会遇到这种结构。Linux 权限到底怎么看比如-rwxr-xr--先不要害怕。拆成- rwx r-x r--第一位-表示普通文件。如果是d表示目录。后面三个一组rwx r-x r--分别代表Owner Group Others也就是文件所有者 文件所属组 其他用户r / w / x 是什么非常简单r read w write x execute所以rwx就是可读 可写 可执行例如r-x就是可以读 可以执行 不能写chmod如果一个脚本run.sh没有执行权限./run.sh可能得到Permission denied可以chmod x run.sh添加执行权限。然后./run.sh就可以运行。sudo ...意思通常可以理解成以更高权限执行这个命令。例如sudo apt install ...bashrc它是用户 Bash shell 的配置文件之一~/.bashrc当你打开交互式 Bash shell 时它可以加载其中的配置。所以很多开发环境会看到source /opt/ros/jazzy/setup.bash或者export PATH...写进~/.bashrc这样以后新终端自动生效。exportexport ↓ 把变量放进当前shell的环境中假设你远程机器人上有/opt/robot/ ├── bin/ ├── config/ ├── lib/ └── logs/那么bin ↓ 程序 config ↓ 配置 lib ↓ 动态库 logs ↓ 日志然后export PATH/opt/robot/bin:$PATH以后可以robot_control而不必写/opt/robot/bin/robot_control这就是 Linux 工程环境。用户 ↓ 权限 ↓ rwx ↓ chmod ↓ sudo以及环境变量 ↓ PATH ↓ which ↓ export ↓ .bashrc ↓ source3、执行一个程序到底发生了什么比如./robot_control大概发生Shell ↓ 找到 robot_control ↓ 创建进程 ↓ 加载程序 ↓ 开始运行 ↓ 得到 PID例如robot_control PID 123454、ps现在到底有哪些进程最基本ps更常用ps aux你会看到很多PID USER CPU MEM COMMAND例如USER PID CPU COMMAND robot 12345 10% robot_control最重要的是PID例如12345这个就是进程 ID。5、SIGTERM假设你的程序有std::atomicbool running{true};然后SIGTERM ↓ 通知程序停止 ↓ running false ↓ 停止接收 ↓ 停止GMR ↓ 处理剩余任务 ↓ 释放资源 ↓ 线程退出 ↓ 程序结束这就是一个比较完整的优雅退出所以 Linux 的SIGTERM和C 的graceful shutdown是可以直接联系起来的。6、SIGKILL还有一个kill -9 12345这里的-9就是SIGKILL它非常暴力。大致可以理解立即终止不给程序正常清理的机会。所以SIGTERM更像“请你退出”而SIGKILL更像“立刻结束”7、SIGINT你在终端运行./robot_control然后按Ctrl C通常就是产生SIGINT可以理解成用户要求程序中断。所以CtrlC ↓ SIGINT ↓ 程序处理 ↓ 退出SIGINT ↓ CtrlC 用户主动中断 SIGTERM ↓ 正常终止请求 适合优雅退出 SIGKILL ↓ 强制终止 最后手段8、管道|现在进入 Shell 非常重要的功能。比如ps aux输出很多。但是我只想看robot_control怎么办ps aux | grep robot_control这里|叫管道意思前一个程序的输出 ↓ 管道 ↓ 后一个程序的输入所以ps aux ↓ 输出很多进程 ↓ | ↓ grep robot_control ↓ 筛选9、grepgrep可以简单理解成从文本中筛选包含某个关键词的行。例如ps aux | grep robot_control就是ps aux ↓ 所有进程 ↓ grep ↓ 只留下包含 robot_control 的内容以后排查日志也经常grep ERROR logfile.txt意思找日志里面包含ERROR的行。10、输出重定向例如./robot_control robot.log原本程序输出 ↓ 终端变成程序输出 ↓ robot.log也就是说把标准输出写入文件。这在测试时非常有用。11、区别非常重要通常会覆盖原文件。而表示追加。例如echo test robot.log就是robot.log原内容 test12、文件描述符Linux 里有一个非常核心的思想程序打开一个资源以后Linux 给程序一个整数用这个整数代表这个资源。这个整数就叫文件描述符 File Descriptor简称 fd例如打开一个文件 ↓ Linux ↓ 返回 ↓ fd 3以后程序就通过fd 3访问这个文件。一个 Linux 程序启动的时候通常已经有三个非常重要的 fd0 → stdin 1 → stdout 2 → stderr记住0标准输入 1标准输出 2标准错误13、SocketSocket 可以简单理解成程序进行网络通信的一个接口。比如两个程序程序A │ │ Socket │ ↓ 网络 │ ↓ Socket │ 程序B程序 Asend()程序 Brecv()Socket 本身也是 fd创建 Socketint fd socket(...);返回的也是一个整数。例如fd 5所以普通文件 ↓ fd Socket ↓ fdLinux 可以用统一的文件描述符机制管理它们。因此你会看到send(fd, ...) recv(fd, ...) close(fd)14、TCP 和 UDPTCP特点连接 可靠 有序 字节流可以理解成A ↓ 建立连接 ↓ B ↓ 持续通信TCP 会处理丢包重传 顺序 确认所以TCP 更关注“可靠地把数据送过去”。UDPUDP 更简单A ↓ 一个数据报 ↓ B没有 TCP 那种完整的连接和可靠传输机制。因此可能丢包 乱序 重复例如你发送消息A 消息B 消息C你以为接收端recv() ↓ A recv() ↓ B recv() ↓ C实际上完全可能recv() ↓ AB或者recv() ↓ A的一部分下一次recv() ↓ A剩下部分 B这就是TCP是字节流不是消息流。需要应用自己考虑。所以TCP必须自己设计协议例如[消息长度][消息内容]假设10 HelloWorld接收端先读取长度 10 ↓ 再读取10个字节 ↓ 得到完整消息或者[Header][Payload]例如┌──────────────┬───────────────┐ │ Header │ Payload │ ├──────────────┼───────────────┤ │ length │ actual data │ │ frame_id │ │ │ type │ │ └──────────────┴───────────────┘15、SocketCANSocketCAN 是 Linux 对 CAN 的一套支持机制。关键点它把 CAN 接口也纳入 Linux Socket 体系。所以你会看到CAN ↓ SocketCAN ↓ Socket接口 ↓ fd这就是为什么你做 Linux 机器人开发时会同时遇到socket fd CAN SocketCAN它们不是几个完全独立的知识点。CAN总线 ↓ Linux CAN驱动 ↓ SocketCAN ↓ Socket ↓ fd ↓ read/write 或 CAN相关接口 ↓ 你的C程序这条链非常重要。16、ZMQ 又是什么ZeroMQ 可以理解成更高层的消息通信框架。它不是简单地send bytes recv bytes而是提供消息 队列 连接模式 通信模式底层 ──────────────── TCP / UDP Socket fd Linux ──────────────── 上层 ZMQ 消息模式 队列 ──────────────── 应用 Protobuf 业务数据它帮你处理了很多socket 连接 队列 消息 线程 缓冲所以你的代码不需要每次都自己处理大量底层 Socket 细节。17、ProtobufProtobuf 主要解决数据怎么编码成适合传输/存储的二进制格式。例如你的程序内部有MocapFrame ├── frame_id ├── timestamp ├── joints └── ...Protobuf 可以把它结构化数据 ↓ 序列化 ↓ bytes然后Protobuf ↓ ZMQ ↓ 网络/进程 ↓ ZMQ ↓ Protobuf反序列化 ↓ 结构化数据所以ZMQ 负责“怎么传”Protobuf 负责“数据怎么表示”。这是非常重要的区分。应用层 ┌─────────────────────────┐ │ MotionFrame / Protobuf │ └────────────┬────────────┘ ↓ ┌─────────────────────────┐ │ ZMQ │ │ PUB/SUB / PUSH/PULL │ └────────────┬────────────┘ ↓ ┌─────────────────────────┐ │ TCP / UDP / Socket │ └────────────┬────────────┘ ↓ ┌─────────────────────────┐ │ Linux fd │ └────────────┬────────────┘ ↓ ┌─────────────────────────┐ │ Linux Kernel │ └─────────────────────────┘而 CANCAN设备 ↓ Linux驱动 ↓ SocketCAN ↓ Socket/fd ↓ C程序Linux I/O │ ├── 普通文件 │ ↓ │ fd │ ├── 管道 │ ↓ │ fd │ └── Socket ↓ fd │ ├── TCP ├── UDP └── SocketCAN然后ZMQ ↓ 更高层的消息通信Protobuf ↓ 数据序列化/反序列化18、日志cat robot.log一次性把整个文件打印出来。如果日志很大就不适合cat。可以less robot.log然后可以上下翻。tail robot.log默认看最后一部分。更常用tail -f robot.log这里-f可以理解成持续跟踪文件的新内容。比如机器人程序正在运行robot.log不断增加frame 100 frame 101 frame 102你执行tail -f robot.log就可以实时看到frame 100 frame 101 frame 102 frame 103 ...这在调试机器人程序时非常实用。19、systemdLinux 的服务管理器。比如你的机器人控制程序robot_control你希望开机自动启动 程序崩溃自动重启 统一查看日志 统一停止/启动这时候就不是简单./robot_control 而是systemd ↓ 管理 ↓ robot_control.serviceService例如定义一个robot_control.service它描述程序在哪里 用什么用户运行 什么时候启动 程序崩溃怎么办 环境变量是什么 日志去哪里于是Linux启动 ↓ systemd ↓ robot_control.service ↓ robot_controlsystemctl先记住几个命令。查看状态systemctl status robot_control启动systemctl start robot_control停止systemctl stop robot_control重启systemctl restart robot_control设置开机启动systemctl enable robot_control取消systemctl disable robot_control本地PC ↓ SSH ↓ 机器人Linux ↓ systemd ↓ 机器人程序 ↓ 日志ssh主要是远程操作而scp主要是远程传文件真正的工程部署应该理解成程序 ↓ 依赖 ↓ 配置 ↓ 权限 ↓ 设备 ↓ 环境 ↓ 启动 ↓ 日志 ↓ 验证现在把我们这几节全部连接Linux │ ┌─────────────┼─────────────┐ ↓ ↓ ↓ 文件系统 用户/权限 环境变量 │ │ │ └─────────────┼─────────────┘ ↓ Shell │ ┌─────────────┼─────────────┐ ↓ ↓ ↓ 进程 文件IO 网络 │ │ │ PID fd Socket │ │ │ Signal │ TCP / UDP │ │ │ │ │ SocketCAN │ │ └─────────────┼─────────────┘ ↓ systemd ↓ 日志 ↓ SSH ↓ 部署这张图你应该真正理解。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑