Linux C编程 | 从0实现telnet获取程序终端控制权
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
一口Linux
扫码关注公众号
扫码阅读
手机扫码阅读
文章主旨:介绍如何在嵌入式Linux项目中通过telnet远程操控主程序,利用dup/dup2函数重定向标准输入输出,实现串口与网络终端之间的灵活切换。
关键要点:
- 使用
dup()和dup2()复制文件描述符,实现标准输入/输出/错误重定向到telnet套接字。 - telnet新连接会关闭旧客户端,且需重启命令处理子线程(因阻塞I/O不会自动迁移)。
- 主程序监听端口2323,每次接受新连接后调用
switch_to_telnet()执行重定向,并重新创建命令线程。 - 代码包含标准备份
std_bakcup()以及在切换时忽略SIGPIPE信号的处理。
内容结构:
一、应用场景
实际项目调试中需通过网络(telnet/ssh)远程控制主程序,本文以telnet为例实现终端控制权的切换与归还。
二、原理
核心函数dup()复制文件描述符(返回最小可用fd),dup2()强制将oldfd复制到newfd(原子关闭newfd)。两者均使多个fd指向同一文件表项,用于标准I/O重定向。
三、程序设计思路
基于之前实现的简单命令行代码,主流程:监听telnet连接→接受连接→关闭旧客户端→switch_to_telnet()进行dup2重定向→重启命令子线程。注意点:新连接需关闭旧客户端;因阻塞I/O不自动迁移,必须重启线程。
四、核心代码
文件列表:cmd.c, color.h, mkapp.sh, tel, telnet.c。
main(): 创建socket(端口2323)、绑定、监听;调用std_bakcup()备份原标准I/O;创建初始命令线程;循环accept新连接,调用switch_to_telnet()并再创建命令线程。switch_to_telnet(): 忽略SIGPIPE;当新fd与旧fd不同时,关闭旧客户端;然后执行dup2(new_fd, STDOUT_FILENO)、dup2(new_fd, STDERR_FILENO)、dup2(new_fd, STDIN_FILENO),将标准输出/错误/输入重定向到telnet连接。
文章总结:本文提供了一个实用的嵌入式远程调试方案,通过dup2实现标准I/O重定向,原理清晰,代码简洁,适合需要远程控制嵌入式设备的开发者参考。
一口Linux
一口Linux
扫码关注公众号
没有了
上一篇
瑞芯微 | RK3568设备树文件整理
下一篇