Linux 重定向 - 标准输入、标准输出 - 终端类型

标准输入(standard input)    0 默认接受来自键盘的输入
标准输出(standard output)  1 默认输出到终端窗口(屏幕)
标准的错误输出(standard error output) 2 默认输出到终端窗口(屏幕)

# 查看当前终端的进程号
[root@sc ~]# echo $$
13082

cd /etc/proc/12082/fd

[root@sc fd]# ll
总用量 0
lrwx------ 1 root root 64 7月  25 15:20 0 -> /dev/pts/2
lrwx------ 1 root root 64 7月  25 15:20 1 -> /dev/pts/2
lrwx------ 1 root root 64 7月  25 15:20 2 -> /dev/pts/2
lrwx------ 1 root root 64 7月  25 15:39 255 -> /dev/pts/2
[root@sc fd]# ls
0  1  2  255

[root@sc dev]# cd pts
[root@sc pts]# ls
0  1  2  ptmx
[root@sc pts]# ll
总用量 0
crw--w---- 1 root tty  136, 0 7月  25 11:53 0
crw--w---- 1 root tty  136, 1 7月  25 11:11 1
crw--w---- 1 root tty  136, 2 7月  25 15:43 2
c--------- 1 root root   5, 2 7月  25 11:08 ptmx

# c开头的文件是字符设备文件:与输入和输出字符相关的文件 character 字符

# /dev/pts/2  -->编号为2的一个字符设备文件

# /dev 存放设备文件的 device  键盘、鼠标、显示器、磁盘等设备,一个设备会有相关文件和它对应

任何命令只要有输出,就可以使用输出重定向
重定向标准输出

正确的输出重定向
>     将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上,会覆盖原来文件里的内容,如果文件不存在会新建
>>     将命令的执行结果追加输出到指定文件,而不是直接显示在屏幕上,不会覆盖原来文件里的内容,如果文件不存在会新建
1> = >
1>> = >>

错误的输出重定向
2>   将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上,会覆盖原来文件里的内容,如果文件不存在会新建
2>>  将命令的执行结果追加输出到指定文件,而不是直接显示在屏幕上,不会覆盖原来文件里的内容,如果文件不存在会新建

# 正确的输出重定向
[root@sc chong]# ls > a.txt
[root@sc chong]# cat a.txt 
a.txt

# 错误的输出重定向
[root@sc chong]# fsif 2>b.txt
[root@sc chong]# cat b.txt 
-bash: fsif: 未找到命令

# 正确的和错误的输出分流,存放到不同的文件里
[root@sc chong]# ls >c.txt 2>d.txt
[root@sc chong]# cat c.txt 
a.txt
b.txt
c.txt
d.txt
[root@sc chong]# cat d.txt 
[root@sc chong]# 

不管正确的还是错误的都重定向到同一个文件
&>   将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上,会覆盖原来文件里的内容,如果文件不存在会新建
&>>  将命令的执行结果追加输出到指定文件,而不是直接显示在屏幕上,不会覆盖原来文件里的内容,如果文件不存在会新建

id  rootroot 1>aa.txt  2>&1 		# 正确和错误的都往同一个文件里输入,会覆盖
id  rootroot 1>>aa.txt  2>&1 		# 正确和错误的都往同一个文件里输入,不会覆盖,只会追加

重定向标准输入
<     将命令中接收输入的途径有默认的键盘更改为指定的文件
<<  追加输入重定向

[root@sc chong]# wc -l c.txt 
4 c.txt

[root@sc chong]# wc -l <c.txt 
4

重定向的本质是去修改文件描述符1对应的那个文件

改变了字符输出的方向,原来是往/dev/pts/2文件输出,现在往/dev/pts/3文件输出

[root@sc pts]# echo hello > /dev/pts/3

[root@sc pts]# hello
hello

使用ssh命令远程连接到192.168.102.141这台服务器,以root用户登录

[root@sc pts]# ssh root@192.168.102.141
The authenticity of host '192.168.102.141 (192.168.102.141)' can't be established.
ECDSA key fingerprint is SHA256:GJLkvon/6JIxY0thYpMWcSIQBVdWFjwOZah+sPUmZ6E.
ECDSA key fingerprint is MD5:cb:bf:d9:ec:3d:33:6c:a4:5c:3c:e2:ce:b8:60:b8:33.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.102.141' (ECDSA) to the list of known hosts.
root@192.168.102.141's password: 
Last login: Tue Jul 25 15:51:59 2023 from 192.168.102.1

查看当前linux系统用户登录的信息

[root@sc pts]# w
 15:45:43 up  2:07,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.102.1    11:08    3:52m  0.06s  0.06s -bash
root     pts/1    192.168.102.1    11:11    4:33m  0.00s  0.00s -bash
root     pts/2    192.168.102.1    15:20    7.00s  0.01s  0.00s w

每打开一个终端,背后就会产生一个bash进程,bash进程会输入和输出的字符设备文件

user 登录的用户名
TTY  表示终端的类型 terminate type
     tty1~tty6  --》真正的终端,Linux系统里最多允许开6个终端
     CTRL+alt+F1~F6  切换到tty1~tty6
     pts/0~n    --》伪终端--》模拟出来的终端 --》shell在windows里模拟出来的一个终端,给我们使用,输入命令,输出效果
面向最终用户使用的一个端口 --》终端用户
form    从哪里登录的Linux系统
WHAT 正在终端运行的命令

wall hello --》给所有的终端发送
echo hello >/dev/pts/1 --》单独给/dev/pts/1终端发送hello

pkill -t  pts/3 -9  # 临时杀死某个登录的用户的进程
pkill 杀死进程的命令
-t  pts/3  根据终端编号
-9       强制杀死这个进程


一个完整的Linux系统包括哪些东西?

  1.内核(kernel):操作系统最核心的软件,和硬件打交道
  2.系统调用(system call):是内核给外面的应用程序的接口,例如:fork(),kill()
  3.应用程序:实现具体的某个功能的程序,例如:mkdir
  4.shell解释器:是一个程序,给命令行操作使用的
  5.库函数:是实现某个功能的程序,可以被其他的程序调用,这些库都是公开的,大家都可以去调用

内核(kernel):操作系统最核心的软件,和硬件打交道

作用:
        1.对cpu进行调度管理
        2.对内存进行分配
        3.对进程进行管理(创建、调度、销毁)
        4.对磁盘里的文件系统进行管理
        5.对网络以及其他的硬件进行管理

硬件:

    cpu:中央处理器,用来计算
    内存:存放运行起来的程序(停电会丢失数据)
    磁盘:存放永久保存的数据(图片、程序代码、视频)
    网卡
    声卡

进程:正在内存里运行的程序
进程由哪些组成?

  1.PCB  进程控制块 process control block:pid、状态、位置等
  2.code 程序代码
  3.data  进程产生的数据

  pid (process id) : 进程的编号
  fd(file descriptor 文件描述符 ):是进程里打开哪些文件,给文件的一个编号
  一个进程打开了100个文件,这个进程对这个100个文件进行编号,每个文件的编号就是一个文件描述符

    系统为每一个进程维护了一个文件描述符
    文件描述符是非负整数 --》0,1,2,3,N
    默认情况下内核允许一个进程最多可以打开1024个文件
    内核给每个进程背后都创建了一个文件描述符表,此表里记录了这个进程打开的所以文件
    文件描述符表:id,文件指针:里面存放的是一个文件的地址

# 查看一个进程可以打开的文件数量
[root@sc pts]# ulimit -n
1024

[root@sc pts]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7183
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7183
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

# 临时修改内核里允许一个进程可以打开的文件数量
[root@ansible_nfs proc]# ulimit -n 1000000

一个进程里可以产生很多的线程;可以把线程当作一个进程

cpu进行调度的时候是根据线程

1个进程里只有1个线程
1个进程里有100个线程

线程可以节约资源:内存,cpu的调度(上下文切换的速度)


如何看到tty1~tty6终端?    
    w命令

[root@sc ~]# w
 10:14:44 up 32 min,  2 users,  load average: 0.01, 0.04, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      10:14   12.00s  0.00s  0.00s -bash
root     pts/0    192.168.102.1    09:42    4.00s  0.01s  0.00s w

如何查看Linux里的所有进程?
    ps -aux

如何根据pid杀死进程?
    kill -9 

[root@sc ~]# ps aux|grep bash
root       2355  0.0  0.1 115680  2144 pts/0    Ss   09:42   0:00 -bash
root       4430  0.0  0.1 115676  2112 tty1     Ss+  10:14   0:00 -bash
root       4491  0.0  0.0 112828   988 pts/0    S+   10:15   0:00 grep --color=auto bash

[root@sc ~]# kill -9 2355

编写脚本杀死所有终端

# 查找出终端类型是pts/2的进程的pid号
[root@sc pts]# ps aux|grep pts/2
root      13079  0.0  0.3 161820  6104 ?        Ss   15:20   0:00 sshd: root@pts/2
root      13082  0.0  0.1 115760  2220 pts/2    Ss   15:20   0:00 -bash
root      17363  0.0  0.1 155452  1872 pts/2    R+   16:24   0:00 ps aux
root      17364  0.0  0.0 112828   988 pts/2    R+   16:24   0:00 grep --color=auto pts/2

# 查看bash进程,可以根据终端类型来确定那个进程
[root@sc pts]# ps aux|grep bash
root      13082  0.0  0.1 115760  2220 pts/2    Ss   15:20   0:00 -bash
root      15126  0.0  0.1 115680  2068 pts/3    Ss+  15:51   0:00 -bash
root      16696  0.0  0.1 115676  2176 tty1     Ss+  16:15   0:00 -bash
root      17454  0.0  0.0 112828   988 pts/2    S+   16:26   0:00 grep --color=auto bash

# 编写kill所有bash的脚本
[root@sc lianxi]# cat kill_bash.sh 
#!/bin/bash

for i in $(ps aux|grep bash|awk '{print $2}')
do
    kill -9 $i
done

# 执行脚本
[root@sc lianxi]# bash kill_bash.sh 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 你可以使用以下代码将标准输出重定向终端: freopen("/dev/tty", "w", stdout); 其中,"/dev/tty" 是指向当前终端设备的文件描述符,"w" 表示以写模式打开文件,stdout 是标准输出流。 ### 回答2: 在C++中,可以使用`freopen`函数将程序的标准输出重定向终端。 首先,需要包含头文件`<cstdio>`。接下来,在程序的适当位置调用`freopen`函数,将标准输出文件(stdout)重定向终端。 ``` #include <cstdio> int main() { // 将标准输出重定向终端 freopen("/dev/tty", "w", stdout); // 程序的其他代码 return 0; } ``` 在上述代码中,`freopen`的第一个参数是重定向的目标文件,其中`/dev/tty`表示当前终端。第二个参数"w"表示以写方式打开文件,第三个参数`stdout`表示要重定向输出流。 通过调用`freopen`函数,程序的标准输出将被重定向终端,即使之后使用`cout`或`printf`等打印函数来输出数据,输出也会直接显示终端上。 需要注意的是,一旦调用`freopen`函数将标准输出重定向终端后,之前已经打开的文件指针(如`ofstream`)将会被关闭,需要重新打开对应文件后才能操作。 另外,`freopen`函数也可以将标准输入重定向终端,方法类似。只需将第二个参数的`"w"`改为`"r"`,第三个参数改为`stdin`即可。 ### 回答3: 在C/C++编程中,可以使用freopen函数来将标准输出重定向终端。 下面是一个简单的示例代码: ```c #include <stdio.h> int main() { freopen("/dev/tty", "w", stdout); printf("Hello, World!\n"); // 这行代码的输出重定向终端 return 0; } ``` 上述代码中,`freopen("/dev/tty", "w", stdout)`的作用是将标准输出重定向终端。其中,`/dev/tty`是Linux系统中系统终端的设备文件路径。 在调用`printf`函数输出时,输出将被重定向终端,而不是默认的标准输出流。 需要注意的是,`freopen`函数需要在所有输出操作之前调用,以确保输出被正确重定向终端。 以上就是使用`freopen`函数将标准输出重定向终端的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩未零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值