当前位置: 首页 > news >正文

进程输入输出及终端属性学习

进程的标准输入输出

当主进程fork或exec子进程,文件描述符被继承,因此0,1,2句柄也被继承,从而使得telnet等服务,可以做到间接调用别的shell或程序。比如如果是远程登录使用的zsh,那么其会重定向到相应的pts

$ ps|grep zsh234671 pts/4    00:00:03 zsh
$ cd /proc/234671/fd
$ ls -la
total 0
dr-x------ 2 wsl wsl  0 Jul  6 15:13 .
dr-xr-xr-x 9 wsl wsl  0 Jul  6 15:13 ..
lrwx------ 1 wsl wsl 64 Jul  6 15:13 0 -> /dev/pts/4
lrwx------ 1 wsl wsl 64 Jul  6 15:13 1 -> /dev/pts/4
lrwx------ 1 wsl wsl 64 Jul  6 15:13 2 -> /dev/pts/4
...

进程在转为守护进程时,可以经0,1,2句柄重定向到/dev/null,做到不输出任何信息。

可以使用dump2可以实现重定向功能:
```c
fd = open("./test.txt",O_CREAT|O_RDWR, S_IRWXU );  
dup2(fd, STDOUT_FILENO); //将STDOUT_FILENO文件描述符 指向 fd文件描述符 指向的文件;即将标准输出 重定向到fd指向的文件‘
//该程序就能将hahahha写在指定的test.txt文件中了
printf("hahahahaha");
close(fd);

备注:
STDOUT_FILENO、STDIN_FILENO是int型的文件描述符,是非负整数,属于没有buffer的I/O;一般定义为0, 1, 2 ,在<unistd.h>定义。

/* Standard file descriptors.  */
#define	STDIN_FILENO	0	/* Standard input.  */
#define	STDOUT_FILENO	1	/* Standard output.  */
#define	STDERR_FILENO	2	/* Standard error output.  */

open()系统函数,返回的是目前未被占用的最小的文件描述符
文件描述符对应的函数是open() read() write() close()等;

stdout stdin stderr 是FILE 类型的文件指针;属于标准I/O,在<stdio.h>。
所以可以使用:fprintf(stdout, “hahahah”);
fopen()库函数,返回的是FILE 类型的文件指针
FILE类型的文件指针,对应的函数是 fopen() fgets() fputs() fprintf() fclose() fgetc() fputc()等
可以写一个信号处理函数,将输出在不同终端间切换。或者通过重定向标准输出+无名管道的方式,实现将子进程的输出用more显示。

终端属性

通过终端属性,可以禁用回显,

#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>int main() {int fd = STDIN_FILENO; // 使用标准输入作为终端设备的文件描述符// 获取当前终端属性struct termios old_attr;if (tcgetattr(fd, &old_attr) == -1) {perror("tcgetattr");exit(EXIT_FAILURE);}// 备份旧的终端属性struct termios new_attr = old_attr;// 修改终端属性new_attr.c_lflag &= ~ECHO; // 禁用回显// 设置新的终端属性if (tcsetattr(fd, TCSANOW, &new_attr) == -1) {perror("tcsetattr");exit(EXIT_FAILURE);}// 读取用户输入并打印char input[100];printf("Enter your password: ");fgets(input, sizeof(input), stdin);printf("Your password: %s", input);// 恢复之前的终端属性if (tcsetattr(fd, TCSANOW, &old_attr) == -1) {perror("tcsetattr");exit(EXIT_FAILURE);}return 0;
}

使用stty -echo就能关闭回显,再使用stty echo打开
使用getty打开一个终端
使用tty查看当前是哪个终端。

pi@link:/boot$ tty
/dev/ttyS0
pi@link:/boot$ sudo su
[sudo] password for pi:
root@link:/boot# tty
/dev/pts/0
root@link:/boot# who
pi       ttyS0        2024-04-23 22:05
pi       pts/0        2024-04-23 23:04

参考
linux 终端设置及读写

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 30 - 最新2024版SpringCloud学习记录 - 项目版本选型
  • 如何在 PostgreSQL 中实现数据的增量备份和恢复?
  • 线性代数中的“过定系统”和“欠定系统”
  • 微软正在放弃React
  • 推荐算法学习笔记2.1:基于深度学习的推荐算法-基于共线矩阵的深度推荐算法-AutoRec模型
  • 2.5 C#视觉程序开发实例1----IO_Manager实现脉冲输出控制
  • 浔川官方宣布官方账号将在CSDN进行无人管理——浔川官方
  • 【Python基础篇】你了解python中运算符吗
  • ESP32——物联网小项目汇总
  • 安卓面试题系列--【1】
  • Linux系统的基础知识和常用命令
  • Kubernetes分享
  • Python从0到100(三十三):xpath和lxml类库
  • Unity 简单载具路线 Waypoint 导航
  • C# Queue、List、LinkedList 性能对比
  • CentOS7 安装JDK
  • Druid 在有赞的实践
  • interface和setter,getter
  • Java程序员幽默爆笑锦集
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 前言-如何学习区块链
  • 小而合理的前端理论:rscss和rsjs
  • 树莓派用上kodexplorer也能玩成私有网盘
  • # 飞书APP集成平台-数字化落地
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (备忘)Java Map 遍历
  • (笔试题)分解质因式
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (七)Java对象在Hibernate持久化层的状态
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四) 虚拟摄像头vivi体验
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (译)2019年前端性能优化清单 — 下篇
  • (转) ns2/nam与nam实现相关的文件
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .gitignore
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET 使用配置文件
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /var/lib/dpkg/lock 锁定问题
  • @PreAuthorize注解
  • [ C++ ] STL---仿函数与priority_queue
  • [ Socket学习 ] 第一章:网络基础知识
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • [001-03-007].第07节:Redis中的管道
  • [2]十道算法题【Java实现】