文件描述符

linux下一切皆文件

文件描述符,是内核为了高效管理已经被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;

文件描述符是一个简单的非负整数,用以标明每一个被进程打开的文件,程序刚刚启动时候,第一个打开的是0,第二个是1,以此类推,也可以理解为是一个文件的身份ID

用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标,显示器)

  • stdin 标准输入 文件描述符0
  • stdout 标准输出 文件描述符1
  • stderr 标准错误 文件描述符2

查看一个进程打开了那些文件

1获取进程号

[root@VM_0_15_centos ~]# vim /etc/passwd

[root@VM_0_15_centos ~]# ps -aux | grep passwd
root 1476 0.1 0.4 151164 4992 pts/2 S+ 22:45 0:00 vim /etc/passwd
root 1534 0.0 0.0 112708 972 pts/1 R+ 22:45 0:00 grep --color=auto passwd
[root@VM_0_15_centos ~]# ll /proc/1476/fd
total 0
lrwx------ 1 root root 64 Aug 24 22:46 0 -> /dev/pts/2
lrwx------ 1 root root 64 Aug 24 22:46 1 -> /dev/pts/2
lrwx------ 1 root root 64 Aug 24 22:45 2 -> /dev/pts/2
lrwx------ 1 root root 64 Aug 24 22:46 4 -> /etc/.passwd.swp

一个进程启动时,都会打开3个文件,标准输入,标准输出,标准出错处理,分别对应012

对文件描述做的操作就是对文件本身的操作,可以直接通过操作文件描述符来修改文件

一个进程可以打开的文件描述符的限制,或者说一个进程可以打开多少文件

[root@VM_0_15_centos ~]# ulimit -n
100001

虽然可以修改,但是只有服务器的内存越大,机器的性能越好时 , 可以修改的值更大

[root@VM_0_15_centos ~]# ulimit -n 100002
[root@VM_0_15_centos ~]# ulimit -n
100002

重定向

输出重定向

定义:

  • 将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上

语法

  • > 文件名 表示将标准输出的内容,写入到后面的文件中,如果文件名已经存在,则会覆盖源文件中的内容
  • >> 文件名 表示将标准输出的内容,追加到后面的文件中,不会清除文件原有内容

查看当前主机的cpu信息,写入到cpu.txt文件中

[root@VM_0_15_centos ~]# cat /proc/cpuinfo > cpu.txt
[root@VM_0_15_centos ~]# cat cpu.txt
processor : 0
vendor_id : AuthenticAMD
cpu family : 23
model : 1
model name : AMD EPYC Processor
...
bogomips : 3992.46
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management:

将内核的版本信息追加到cpu.txt中

...
bogomips : 3992.46
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: Linux VM_0_15_centos 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

清空一个文件,而不是删除

[root@VM_0_15_centos ~]# > cpu.txt
[root@VM_0_15_centos ~]# cat cpu.txt
[root@VM_0_15_centos ~]#

输入重定向

定义

  • 将接收输入的途径由默认的键盘改为文件

搜索文件中的某个字符

[root@VM_0_15_centos ~]# uname -a > cpu.txt
[root@VM_0_15_centos ~]# grep centos < ./cpu.txt
Linux VM_0_15_centos 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

将xuegod.sql导入到mysql数据库中

mysql -uroot -p 123456 < xuegod.sql

EOF

分界符,形式不是固定的,EOF可以自定义,但是前后的EOF必须成对出现,且不能和shell命令冲突

1使用eof作为分界符时,再次输入eof字符时,会自动退出

[root@VM_0_15_centos ~]# cat >> cpu.txt << eof
> aaa
> bbb
> eof
[root@VM_0_15_centos ~]#

2如果要在文件中输入eof时,可以自定义分界符

[root@VM_0_15_centos ~]# cat > cpu.txt << 123
> aaa
> bbb
> eof
> 123
[root@VM_0_15_centos ~]#

3在shell脚本中可以输出一组字符,比如菜单

[root@VM_0_15_centos ~]# cat eof.sh
#!/bin/bash
cat <<eof
======================
1,mysql
2,httpd
3,oracle
======================
eof
[root@VM_0_15_centos ~]# bash ./eof.sh
======================
1,mysql
2,httpd
3,oracle
======================

错误重定向

将命令执行过程中出现的错误信息,(选项或者参数错误,)保持到指定的文件,而不是直接显示到显示器

  • 操作符: 2>

标准输出 1>,简写 >

标准输入 1<,简写 <

标准错误 2>,不能简写

  • 在实际应用中,错误重定向可以用来收集执行的错误信息,为排错提供依据
  • 对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁

1将错误显示的内容和正确显示的内容分开

[root@VM_0_15_centos ~]# ls /etc/passwd xxxx > a.txt 2> b.txt
[root@VM_0_15_centos ~]# cat a.txt b.txt
/etc/passwd
ls: cannot access xxxx: No such file or directory

null黑洞和zero空文件

/dev/null

被看做黑洞,所有写入它的内容都会永久丢失.而尝试从它那儿读取内容则什么也读不到,

然而/dev/null对命令行和脚本都非常有用

[root@VM_0_15_centos ~]# echo aaa >> /dev/null
[root@VM_0_15_centos ~]# cat /dev/null
[root@VM_0_15_centos ~]#

/dev/zero

在类UNIX操作系统中,/dev/zero是一个特殊的文件,当你读它的时候,她会提供无限的空间符

典型用法是用它来产生一个特定大小的空白文件

使用dd命令产生一个50M的文件

[root@VM_0_15_centos ~]# dd if=/dev/zero of=c.txt bs=1M count=50
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 0.0676305 s, 775 MB/s [root@VM_0_15_centos ~]# ll -h c.txt
-rw-r--r-- 1 root root 50M Aug 24 23:16 c.txt
  • if代表输入文件.如果不指定if,默认就会从stdin中读取输入
  • of代表输入文件.如果不指定of,默认就会将stdout作为默认输出
  • bs代表字节为单位的块大小
  • count代表被复制的块数

&>和>&符号

&表示等同于的意思

1把正确和错误的消息输入到相同的位置

  • 1>&2 把标准输出等同于标准错误
  • 2>&1 把标准错误等同于标准输出
[root@VM_0_15_centos ~]# ls /tmp/ xxx > 1.txt 2>&1
[root@VM_0_15_centos ~]# cat 1.txt
ls: cannot access xxx: No such file or directory
/tmp/:
passwd.txt
systemd-private-bf711b8563ea4002ae117d6ff54122cc-ntpd.service-lWhZaP

2把正确和错误的消息输入到相同的位置,可以简写为

[root@VM_0_15_centos ~]# ls /tmp/ xxx &> 2.txt
[root@VM_0_15_centos ~]# cat 2.txt
ls: cannot access xxx: No such file or directory
/tmp/:
passwd.txt
systemd-private-bf711b8563ea4002ae117d6ff54122cc-ntpd.service-lWhZaP

3工作中shell脚本中的, >/dev/null 2>&1

  • 解释,将标准错误等同于标准输出,将标准输出,输出到黑洞文件中

    将产生的信息丢弃

命令判断

三个特殊符号

; 分号

  • 不考虑命令的相关性,会连续执行
[root@VM_0_15_centos ~]# ls /aaa /bbb ;echo aaa
ls: cannot access /aaa: No such file or directory
ls: cannot access /bbb: No such file or directory
aaa

&& 逻辑与

  • 它只有在前面的命令执行成功后,后面的命令才会去执行

如果/opt目录存在,则在/opt下面新建一个文件a.txt

[root@VM_0_15_centos ~]# cd /opt/ && touch a.txt
[root@VM_0_15_centos opt]# ls /opt/a.txt
/opt/a.txt

源码编译经典实用方法

./configure && make -j 4 && make install

|| 逻辑或

  • 如果前面的命令执行成功,后面的内容不会执行
  • 如果前面的命令执行失败,会执行后面的内容
[root@VM_0_15_centos ~]# ls xxx || cd /home/
ls: cannot access xxx: No such file or directory
[root@VM_0_15_centos home]#
[root@VM_0_15_centos home]# cd /root/ || echo aaa
[root@VM_0_15_centos ~]#

运算顺序

  • 从左到右,一个一个执行,从上到下执行

linux重定向 null和zero的更多相关文章

  1. Linux重定向相关(转载帖,供自己cookbook)

    Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作.  Linux默 ...

  2. Linux重定向命令

    linux重定向命令应用及语法  [复制链接]   发表于 2008-12-18 18:24 | 来自  51CTO网页 [只看他] 楼主     1. 标准输入的控制语法:命令 文件将命令的执行结果 ...

  3. Linux重定向及nohup不输出的方法

    转载自:http://blog.csdn.net/qinglu000/article/details/18963031   先说一下linux重定向: 0.1和2分别表示标准输入.标准输出和标准错误信 ...

  4. 使用Linux重定向解决nohup.out无写权限问题

    ■场景 执行nohup命令的时候,经常会出现下面这种没有写入权限的错误. nohup: ignoring input and appending output to `nohup.out'nohup: ...

  5. Linux nohup 关闭终端的时候,程序依然能在后台运行( linux重定向及nohup不输出的方法)

    先说一下linux重定向: 0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出.在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号 ...

  6. linux重定向与管道符(一)

    linux重定向和管道符 为什么要使用重定向 1.当屏幕输出的信息很重要,而且我们需要将他存下来的时候: 2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时: 3.系统的例行命令,例如定时任务的执 ...

  7. 【Linux】【专项突破】Linux重定向与管道

    [专项突破]Linux重定向与管道 This article is written by Xrilang(Chinese Name:萌狼蓝天) If you want find me ,You can ...

  8. 【转】Linux重定向操作符

    Linux重定向操作符 功能描述 > 将命令输出写入文件或设备,而不是命令提示符或句柄,清空原有文件然后写入 < 从文件而不是从键盘或句柄读入命令输入 >> 将命令输出添加到文 ...

  9. [轉]Exploit The Linux Kernel NULL Pointer Dereference

    Exploit The Linux Kernel NULL Pointer Dereference Author: wztHome: http://hi.baidu.com/wzt85date: 20 ...

随机推荐

  1. NET Excel转换为集合对象

    1.仅适用于规则Excel:表头和数据一一对应 2.涉及到Excel转换为集合对象的部分代码,完整npoi帮助类点击查看 /// <summary> /// 默认把excel第一个shee ...

  2. C# 多线程处理List数据

    代码思路 将要处理的数据放到ConcurrentQueue中,然后开启多个线程去处理数据,处理完成后,再到队列中获取下一个待处理数据. ConcurrentQueue 表示线程安全的先进先出 (FIF ...

  3. SQLMap常用教程

    先安装 python环境(2.6.x或2.7版本) ,再将SQLMap 放在安装目录下 注意:sqlmap只是用来检测和利用sql注入点的,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql ...

  4. laravel 163发送邮件

    配置163邮箱账户 首先需要有163邮箱,这里在163邮箱必须在设置里面开启SMTP服务,并设置密码 修改laravel根目录下的.env文件, 设置邮箱相关内容: MAIL_DRIVER=smtp ...

  5. python接口上传图片和文件的方法

    import requests def sendImg(img_path, img_name, img_type='image/jpeg'): """ :param im ...

  6. java socket通信:聊天器(1)

    目的:实现多个客户之间的通信 首先,这个聊天器的框架是这样的: 对于服务器端:建立socket,连接到服务器,并且开始监听. import java.io.*; import java.util.Ar ...

  7. devops 下测试组织管理面临的挑战及应对

    导读 先从引发的5个问题讲起,再简单回顾一下devops 简介和兴起背景 ,再从itest 测试管理团队的视角提出应对办法 DevOps后,测试面临的挑战        敏捷开发必然是迭代开发管理模式 ...

  8. 基于图的异常检测(三):GraphRAD

    基于图的异常检测(三):GraphRAD 风浪 一个快乐的数据玩家/风控/图挖掘 24 人赞同了该文章 论文:<GraphRAD: A Graph-based Risky Account Det ...

  9. P3731 [HAOI2017]新型城市化(tarjan+网络流)

    洛谷 题意: 给出两个最大团的补图,现在要求增加一条边,使得最大最大团个数增加至少\(1\). 思路: 我们求出团的补图,问题可以转换为:对于一个二分图,选择删掉一条边,能够增大其最大独立集的点集数. ...

  10. 题解:[ZJOI2014]璀灿光华

    原题链接 OJ 题号 洛谷 3342 loj 2203 bzoj 3619 题目描述 金先生有一个女朋友没名字.她勤劳勇敢.智慧善良.金先生很喜欢她.为此,金先生用\(a^3\)块\(1 \times ...