前言
复杂问题简单记,先了解一下概念,对于一般的小程序而言这两种启动方法应该用不上,如果程序瞬间的就结束了,是否挂起与是否后台也就没有了意义,所以标题中提到的方式常用来启动需要一直运行的程序,比如游戏服务器。
假如我们直接通过命令行./game_server运行一个简单的游戏服务器,那么会发现这个运行程序霸占了整个命令窗口,此时,我们无法再运行其他的程序,所有的输入都变成了game_server的输入,而命令终端此时也只能输出game_server程序的输出信息了。
接着再来了解两个信号,针对于霸占了命令终端的game_server我们可以采用以下方式将其终止掉,使用Ctrl+C组合键,实际上是给程序发送了SIGINT信号,可以以直接关掉命令终端,这个进程也会死掉,实际上是给程序发送了SIGHUP信号,而标题中的所说的两种方式就是针对于这两种信号的。
两种方式的区别
nohup
nohup是no hang up的缩写,就是不挂断的意思,忽略SIGHUP信号,在关闭命令终端后程序依旧运行&
&是只后台运行,即忽略SIGINT信号,也就是按Ctrl+C不会终止程序,但是关闭命令行终端程序终止
总结
所以要想程序忽略SIGINT和SIGHUP两种信号需要两种表示方法一同使用,总结如下
| 命令 | 忽略信号 | 按Ctrl+C结果 | 关闭终端 | 标准输入 | 输出 | 
|---|---|---|---|---|---|
./game | 
无 | 程序终止 | 程序终止 | 只能给game输入 | 终端输出 | 
nohup ./game | 
SIGHUP | 程序终止 | 依旧运行 | 输入被忽略 | 输出到nohup.out文件 | 
./game & | 
SIGINT | 依旧运行 | 程序终止 | 输入正常,终端可用 | 无输出 | 
nohup ./game & | 
SIGINT、SIGHUP | 依旧运行 | 依旧运行 | 输入正常,终端可用 | 输出到nohup.out文件 |