ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

竖线 |:管道、按位或、掩码组合

竖线 |:管道、按位或、掩码组合 一、前言在 Linux 学习过程中绝大多数人都会被同一个符号|搞混淆命令行里它是管道、代码里它是位运算、系统函数参数里它是标志叠加。很多人疑惑明明都是竖线为什么功能完全不同标准答案符号本身没有任何意义解析环境决定意义。Shell 解释器、C语言编译器、Linux 内核三套完全不同的解析规则互不干涉。二、Shell 终端中| 是「管道符」1. 作用Shell 里的|和数学运算没有任何关系。它的唯一作用把前一个命令的输出交给后一个命令当输入实现进程数据接力。2. 特点多个命令同时运行流水线并发数据在内存流动不产生临时文件下游依赖上游输出实现链式数据处理3. 示例ls -l | grep txt | wc -l cat app.log | grep error | awk {print $5} | sort | uniq -c4. Shell 极易混淆四组符号|管道数据接力||逻辑或前命令失败才执行后命令 逻辑与前命令成功才执行后命令 后台并行两个命令独立同时跑三、编程语言中| 是「按位或运算符」在 C / C / Python / Java 中|是标准二进制位运算纯粹数学计算和管道无关。1. 运算规则有1则1全0才0逐位独立计算。0b0010 | 0b0100 0b01102. 基础示例int a 2; // 0010 int b 4; // 0100 int res a | b; // 0110 6四、系统编程中| 是「掩码叠加」最容易混淆你写 open、socket、epoll 时看到的O_WRONLY | O_CREAT | O_TRUNC这里绝对不是管道是标准按位或运算。1. 内核 flag 本质Linux 所有 flag 本质都是整数掩码每一个二进制 bit 代表一个开关功能。内核宏定义简化如下#define O_WRONLY 0001 // 只写 #define O_CREAT 0100 // 不存在则创建 #define O_TRUNC 1000 // 存在则清空2. 按位或叠加多个功能使用|可以同时开启多个开关0001 O_WRONLY | 0100 O_CREAT | 1000 O_TRUNC 1101最终结果同时拥有只写、创建、清空三种能力。3. 为什么不能用加号 加法会进位、会丢 bit会导致功能错乱按位或只置1、不进位是唯一安全的叠加方式。#define A 0b0010 #define B 0b0010 A B 0b0100 // 错误进位丢失 A | B 0b0010 // 正确保留开关状态4. 经典系统调用统一写法// 文件打开 open(test.txt, O_WRONLY | O_CREAT | O_TRUNC, 0664); // 非阻塞 socket socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); // epoll 多事件监听 ev.events EPOLLIN | EPOLLOUT;五、一张表彻底终结混淆使用场景符号含义本质示例Shell 命令行管道符进程数据流传递ls | grep txt代码数值运算按位或二进制数学运算x a | b系统函数 flag掩码按位或叠加多个功能开关O_WRONLY|O_CREAT六、最终总结终端里的|是管道负责命令数据流接力代码里的|是按位或负责二进制运算open/socket 参数里的|是掩码叠加用来组合多个系统功能永远不要用代替|组合系统标志符号不决定功能环境决定一切。
返回列表