Linux C编程 | 从0实现telnet获取程序终端控制权

telnet dup2 Linux & 专辑
发布于 2026-06-13
2

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

扫码阅读
手机扫码阅读

文章主旨:介绍如何在嵌入式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