linux下的expect的简单用法及举例

1、使用expect前,需要先安装两个rpm包,下载:http://download.youkuaiyun.com/detail/wang7dao/4416172
# rpm -ihv expect-5.43.0-8.el5.i386.rpm
# rpm -ihv expect-devel-5.43.0-8.el5.i386.rpm


2、使用脚本文件的例子--实现自动输密码
#!/usr/bin/expect -f
set password 123456
#download
spawn scp root@192.168.1.218:/root/a.wmv /home/yangyz/
set timeout 300
expect "root@192.168.1.218's password:"
set timeout 300
send "$password\r"
set timeout 300
send "exit\r"
expect eof


3、在sh脚本中嵌入expect的例子--通过连上一个公网的服务器再转跳到一个内网的服务器上,用脚本实现不用输密码,直接使用./goto.sh servername
#!/bin/bash
passmsmallq10="a"
passzhsh="a"
passfcwr="b"
passwapfx="c"
passadfx="d"


ip1="200.100.10.10"
ip2="10.100.100.70"
ip3="10.100.100.60"
ip4="10.100.100.10"
ip5="10.100.100.20"


case $1 in
"zhsh") passstr=$passzhsh ipstr=$ip2 ;;
"fcwr") passstr=$passfcwr ipstr=$ip3 ;;
"wapfx") passstr=$passwapfx ipstr=$ip4 ;;
"adfx") passstr=$passadfx ipstr=$ip5 ;;
*) echo "The parameter $1 isn't exist"
exit 0 ;;
esac


command1="ssh -l m_smallq -p 36000 $ip1"
command2="ssh -l mqq -p 36000 $ipstr"


expect -c "
set timeout 60;
spawn $command1;
expect {
\"221.130.15.10's password:\" {send \"$passmsmallq10\r\"; exp_continue}
\"m_smallq\" {send \"$command2\r\"; exp_continue}
\"mqq's password:\" {send \"$passstr\r\";interact}
}
"


对上面例子的expect的解说
expect -c "..." --里面输入命令
expect {...} --里面的多行记录,从上向下扫描匹配,谁先匹配谁先处理。


4、ssh到另一台机子执行df -h后退出,要点是send后面可以跟多个命令,通过\r来分行成多个命令
#!/bin/bash
ip1="183.62.178.191"
command1="ssh -l root -p 14322 $ip1"


expect -c "
spawn $command1;
expect {
\"183.62.178.191's password:\" {send \"aa\r\"; exp_continue}
\"root@\" {send \"df -h\r exit\r\"; exp_continue}
}
"
<think>好的,我现在需要解释C语言中`likely`的编程思想。用户之前问过关于雷达检测算法的工作计划,现在转向了C语言的`likely`宏,这可能与性能优化有关。首先,我需要确认`likely`的作用和它在代码中的使用场景。 我记得`likely`和`unlikely`是用于分支预测的宏,通常与条件语句一起使用,告诉编译器哪个分支更可能被执行,从而帮助编译器优化代码,提高执行效率。例如,在Linux内核代码中常见这种用法。这些宏通过GCC的内建函数`__builtin_expect`实现。 接下来,我需要详细解释它们的编程思想。首先,分支预测的概念:现代处理器有流水线,如果遇到条件分支,需要预测哪条分支更可能执行,以减少流水线停顿。如果预测正确,可以提升性能;错误则导致性能损失。`likely`和`unlikely`就是给编译器提示,让编译器生成更优化的指令顺序,比如把更可能执行的分支放在前面,减少跳转。 然后,具体到C语言中的实现,这些宏如何定义。比如: ```c #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) ``` 这里`!!`的作用是将表达式转换为布尔值,确保结果为01。`__builtin_expect`告诉编译器期望表达式的结果是第二个参数的值(10),从而优化分支。 需要举例说明使用场景,比如在错误处理中,通常错误发生的概率低,所以用`unlikely`标记错误条件,使得正常流程更高效。例如: ```c if (unlikely(error)) { // 处理错误 } else { // 正常流程 } ``` 这样编译器会将正常流程的代码放在前面,减少分支预测错误带来的性能损失。 还要提到适用场景和注意事项。比如,在性能关键代码中使用,且需要基于实际的数据分析,不能滥用。否则错误的分支提示可能导致性能下降。此外,不同编译器可能有不同的实现,GCC支持,其他编译器可能不支持,需要考虑可移植性。 最后,总结编程思想:通过给编译器提供分支概率信息,优化指令布局,减少流水线停顿,提升程序性能。这是底层优化的一种手段,适用于对性能要求高的场景。</think>以下是关于C语言中`likely`宏的编程思想及其实现的详细解释: --- ### **1. `likely`的核心思想:优化分支预测** 在计算机体系结构中,**分支预测**(Branch Prediction)是现代CPU流水线技术的关键优化手段。当代码中存在条件分支(如`if-else``)时,CPU会尝试预测分支的执行方向,从而提前加载指令,避免流水线停滞。 `likely`和`unlikely`宏的作用是**通过静态提示(Hint)告诉编译器哪个分支更可能被执行**,帮助编译器生成更优的指令顺序,减少分支预测错误的惩罚。 --- ### **2. 底层实现:基于编译器内建函数** `likely`和`unlikely`通常通过GCC的`__builtin_expect`内建函数实现: ```c #define likely(x) __builtin_expect(!!(x), 1) // 期望条件为真(概率高) #define unlikely(x) __builtin_expect(!!(x), 0) // 期望条件为假(概率低) ``` - `!!(x)`:将任意表达式`x`转换为布尔值(01),确保语义明确。 - `__builtin_expect(exp, value)`:提示编译器`exp`的预期结果为`value`。 --- ### **3. 代码优化原理** 假设有以下代码: ```c if (likely(condition)) { // 高频执行分支 } else { // 低频执行分支 } ``` 编译器会**将`likely`标记的分支代码放在主路径(Fall-through path)**,减少跳转指令(如`jmp`)带来的性能损耗。 对应的汇编代码可能优化为: ```assembly ; 假设 condition 为真(likely路径) test condition je .L2 ; 仅当条件不满足时跳转(低频分支) ; 高频分支代码直接顺序执行 ``` --- ### **4. 典型应用场景** #### **(1) 错误处理** ```c if (unlikely(file_open_failed)) { log_error(); // 错误处理(低频) return -1; } // 正常文件操作(高频) ``` #### **(2) 循环中的终止条件** ```c while (likely(!timeout)) { process_data(); // 高频循环体 } ``` #### **(3) 状态机与热点路径** ```c switch (state) { case likely(NORMAL): handle_normal(); break; case ERROR: handle_error(); break; } ``` --- ### **5. 性能影响与注意事项** - **性能提升**:在分支预测错误率高的场景(如误判率>20%),使用`likely`可提升10%~30%的性能。 - **适用场景**:适用于**高频执行且分支概率偏差显著**的代码(如内核、网络协议栈)。 - **注意事项**: 1. **避免滥用**:错误提示可能导致性能下降。 2. **依赖编译器**:GCC/Clang支持,其他编译器可能不兼容。 3. **数据驱动**:应基于Profiling(如`perf`工具)确定分支概率。 --- ### **6. 扩展:静态分支预测 vs 动态分支预测** | 特性 | 静态分支预测(`likely`) | 动态分支预测(CPU硬件) | |--------------------|-----------------------------|------------------------------| | 决策依据 | 程序员/编译器提示 | CPU运行时历史记录 | | 优化层级 | 编译期代码布局优化 | 硬件级指令预取 | | 适用场景 | 明确已知分支概率的代码 | 通用场景,无程序员干预 | --- ### **总结** `likely`的编程思想是**通过显式标注分支概率,辅助编译器优化指令布局,降低流水线停顿风险**。它是底层性能调优的经典手段,但需结合具体场景谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值