当前位置: 首页 > 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 终端设置及读写

http://www.lryc.cn/news/393590.html

相关文章:

  • 关于redis集群和事务
  • ctfshow-web入门-文件包含(web88、web116、web117)
  • My sql 安装,环境搭建
  • JVM原理(二十):JVM虚拟机内存的三特性详解
  • Flink 窗口触发器(Trigger)(二)
  • CH12_函数和事件
  • Android- Framework 非Root权限实现修改hosts
  • mac安装达梦数据库
  • 14-41 剑和诗人15 - RLAIF 大模型语言强化培训
  • 每日一题~oj(贪心)
  • 成人高考报名条件及收费标准详解
  • openmetadata1.3.1 自定义连接器 开发教程
  • PostgreSQL 如何优化存储过程的执行效率?
  • 普中51单片机:数码管显示原理与实现详解(四)
  • web缓存代理服务器
  • 容器:queue(队列)
  • 探索 WebKit 的后台同步新纪元:Web Periodic Background Synchronization 深度解析
  • ctfshow web入门 web338--web344
  • mupdf加载PDF显示中文乱码
  • 常用的限流工具Guava RateLimiter 或Redisson RRateLimiter
  • 卷积神经网络(CNN)和循环神经网络(RNN) 的区别与联系
  • Unity【入门】场景切换和游戏退出及准备
  • Python 函数递归
  • MyBatis(27)如何配置 MyBatis 实现打印可执行的 SQL 语句
  • 3.js - 裁剪平面(clipIntersection:交集、并集)
  • 在5G/6G应用中实现高性能放大器的建模挑战
  • Perl 数据类型
  • 网络协议 -- IP、ICMP、TCP、UDP字段解析
  • 【工具】豆瓣自动回贴软件
  • 初学Spring之动态代理模式