编译程序与控制进程

在Linux上一个重要的任务就是运行服务端程序,本节来探讨这个问题

一、gcc

gcc是Linux上通用的编译器。换句话说,我们需要把代码放到远程机器上,用gcc编译出本地版本再运行。

第一步安装gcc,在Ubuntu上使用sudo apt install g++。(安装g++会自动安gcc)
sudo表示super user do,设计更改系统层面的命令都要加上这个。
那个apt install是Ubuntu上安装软件的指令,其他系统指令会略有区别。
也有可能已经自带,就不用安装了。
安装完成后使用gcc –version确认是否安装成功。

新建文件夹code,然后cd进去并输入一段简单的c代码

就是输出一个hello world

那么如何编译呢?
很简单,确定c文件存在后,使用命令gcc c文件名 -o 生成的可执行文件名

现在目录下面有了HelloC可执行文件,增加执行权限并执行

二、g++

然而如果写c++代码用gcc编译会报错,原因是gcc命令不能和c++的头文件和库联接,所以通常用g++来完成链接

同样写一段c++代码

接下来使用g++编译

运行结果:

三、手动控制进程

Linux一般都是跑服务端,而服务端一般内部都有一个无限循环或者阻塞,那么问题自然就是如何干预跑起来的程序?

需要使用命令行来处理

ps显示当前进程,可以配合选项-au查看更具体的信息
如果使用-aux则显示所有包含其他使用者的进程

显示内容可能很多,但是最重要的是PID:进程号。
因为接下来的干预都需要指定进程号

接下来做个实验,写一段c++代码

无限循环,每5秒钟输出一个日志
使用了c++11标准,必须在编译选项中指定flag不然无法编译

编译命令

仅g++ 4.8及以上版本才支持C++ 11标准,所以先看版本
然后使用-std=c++11指定c++11标准
接下来就可以编译了

此时如果运行Loop,会每隔五秒钟输出日志

那么怎么干预呢?
像上面这种情况,焦点在程序,输入的任何命令都会被当作cin,因此是没办法从命令行干预的,需要使用ctrl+c强制结束,比如这样

可以看到焦点回到命令行了

这种方法缺点还是比较明显的,因为一旦运行起来就出不来了
所以在启动程序的时候要使用另一种方法:nohup + &
简单来说,在命令最后加上&表示让程序后台运行,免疫ctrl+c退出或者ctrl+z挂起,但是如果退出登录则程序自动退出
nohup的意思是退出登录则程序依然运行
于是两个加起来就是坚硬的进程了
更加详细的解释可见:https://www.jianshu.com/p/93a45927f013

用以上命令运行Loop
会返回进程号,显示一个输出重定向,输入的内容不显示在终端
使用ps看下会发现确实存在进程

默认的输出重定向为当前目录的nohup.out文件

接下来使用kill命令终止进程
语法很简单直观

kill跟进程号
可以看见终止了

以上就是控制进程的基础方法