在写本周小项目时,仔细了解了一下后台运行,输入,输出重定向和管道这些东西,因为作者是个水货,以前对这些东西真的是一知半解。
后台运行程序
我们在命令后面加上&,表示让这个进程去后台执行,即ctrl+c后仍在后台运行,但当关闭linux终端时,此程序就不在运行了,它接收到终端断开连接的信号就关闭了程序。
那么问题来了,如何在关闭终端后让这个程序还在跑呢?或者说让系统忽略终端断开连接的信号?我们可以直接在命令前面加上nohup,让系统忽略这个信号,那么就算关闭了终端,这个程序依旧可以运行。当我们想要关闭这个程序时,可以用kill命令。
输入 输出重定向
刚刚提到,让程序在后台运行,但如果当程序有输出时,它还是会影响到我们,这个时候,我们就可以让它输出到我们所指定的文件中去。如:command >output &
这就是让进程直接输出到output这个文件中去。那如果当进程出错,那错误信息是不是也可以存放到一个文件中呢?是的!
在这之前,我们先来看一个东西:
标准输入:0
标准输出:1
标准错误:2
所以写成这样:command 1>output 2>error &,1指标准输出,2指标准错误,输出信息存放在output这个文件中,错误信息存放在error这个文件中。那如果我想把输出信息和错误信息存放在一个文件中呢?是不是可以这样写:command 1>output 2>output &。
这样是不行的! 因为写成相同的文件名会冲突。
正确的写法应该是:ommand 1>output 2>&1 &。
如果我们想忽略输出信息和错误信息呢?那就要用到/dev/null 这个设备了,/dev/null就相当于一个无底洞,所有定向到它的信息都会消失的无影无踪。所以当我们想忽略输出信息时,command 1>/dev/null 2>error &,同理,忽略错误信息:command 1>output 2>/dev/null &;忽略全部输出:command >/dev/null 2>&1 &。
管道
我们说,linux下一切是文件,但管道是特殊的文件,因为它解决了文件之间不能通信的问题。管道是linux中的一种通信方式,是把一个程序的输出直接连接到一个程序的输入。
管道命令的操作符是:”|”
管道命令 就是用来连接多条指令的,前一条指令的输出流向会作为后一条指令的操作对象。
管道只能处理由前面一条指令传出的正确输出信息,对错误信息是没有直接处理能力的,然后,传递给下一条指令,作为操作对象。
那么管道是如何实现进程之间的通信的:
(1)父进程创建管道,得到两个⽂件描述符指向管道的两端
(2)父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。
(3)父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管读写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。