如题,本篇的主题中心是利用TCP在应用层实现基本使用,并引出一些Linux的其他概念,重点是理解守护进程,那么下面首先进行初步的实现
TCP协议
那在TCP的协议接口,本质上和UDP是比较相似的,只是在对应的特性进行消息传输发送的过程中有一些区别,但是在大体的整体框架使用其实是相似的过程,都是创建套接字,绑定来进行通信,因此本篇主要讲述的是和UDP不同的地方,在本地创建套接字的过程就不再进行赘述了
TCP和UDP不同的第一点在此就要展示出来了:TCP是一个面向连接的服务器,也就是说在正式通信之前,它一定得随时随地的等别人先连接上再说,也就是说服务器要想办法来等别人和我连,因此引出了第一个TCP的接口:
该函数参数表示的意思是,把对应套接字设置为监听状态,这样能够保证让服务器一直处于监听状态直到有客户连接我,然后把信息送上来进行处理
第二个接口是accept,表示的是获取新链接
这个参数其实和前面UDP的recvfom比较类似,都是表示的是等待接受信息,而它的返回参数也是一个文件描述符,在文件描述符这里就有些许不一样了:
获取了文件描述符后,之后的操作其实就和普通的文件操作是类似的,都是获取利用文件描述符进行文件的读和写的功能
守护进程
首先给出如下的实例代码
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
while (true)
{
cout << "hello world" << endl;
sleep(1);
}
return 0;
}
这是一个很简单的代码,主要是要实现一个循环打印的一个效果,那当运行的时候会发现,此时对于命令行的操作已经没有任何效果了:
那这是为什么?在搞清楚这个问题前,先看一下Linux的登陆原理
当有一个用户要进行登陆Linux服务器的时候,此时Linux系统会创建一个对应的会话页面,也叫做session,未来有几个用户登录就会对应的创建多少个session,之后在登陆的会话中会创建一个叫做bash进程,这个bash进程就是所谓的命令行解释器,未来有多少人登录这个服务器就会创建多少个bash和对应的会话,那这个bash就会为当前的用户提供所谓的命令行的服务,那在终止进程的时候会使用Ctrl+C的命令,这个命令本质上来说就是一个发送信号的命令,这是在之前就有的逻辑,当使用这个信号终止掉进程之后,这个命令就又可以被使用了
在Linux中是存在前台进程和后台进程的,这个说法不准确,这里先这样描述,那因此在创建会话之后会首先创建一个bash进程,那这个进程本质上就是创建了一个前台进程,而对于前台进程来说,不管有多少后台进程,在同一时间内只允许存在一个前台进程,所以前面不能使用命令行的原因就是,当启动这个process进程后,就会把bash进程放到后台进程中,而当这个进程脱离了前台进程之后,bash进程就又会被提到前台进程来,来为用户提供命令行的服务信息
那现在的问题是,既然如此,该如何进行区分到底是前台进程还是后台进程呢?答案是键盘文件,键盘是区分前台后台进程的一个重要指标,该如何理解这句话呢?
显然,当bash进程处于前台进程的时候,可以获得键盘向标准输入写的信息,进而才能发送到显示器上,本质上来说是因为前台进程拥有读取信息的能力,才能不断地从标准输入文件中来获取对应的键盘文件传递过去的信息,说白了,操作系统只允许前台进程来获取标准输入的信息
切换到后台任务
./process &
当任务被切换到后台任务之后,此时bash进程就又会被提到前台来,就可以继续提供对应的服务信息了
查看后台任务
jobs
该命令可以查看当前的后台进程
切换前后台进程
那将后台进程提到前台进程如何操作呢?
fg [任务号]
此时就将对应的后台进程提到了前台进程,此时就能向这个进程发送2号信号使得其进行终止了
进程组的概念
首先,创建一组进程,并使其在后台进行运行
此时看表头,继续扩充对于表头的认识:
SID就是所谓的session id,由于这些进程都是在当前的会话创建的,所以它们的session id是一样的
那这个PGID是什么呢?这个G表示的就是Group的概念,对于普通进程来说,创建一个进程的pid和pgid是一样的,但是对于刚才这样创建进程来说,一次性创建一批进程,都是用sleep来创建的一批进程,那这些进程其实是隶属于一个进程组的,而这个进程组中第一个进程就是进程组的组长
那进程组和任务有什么关系呢?在jobs命令中查看到的其实就是任务,那下面阐述任何和进程组的关系
从狭义上来讲,进程就是任务,进程控制块中的task的意义就在于此,而进程组中的多进程有时候可能是会去完成同一个任务,所以任务和进程组的关系可以看成是一个具体的事,可以由一个人完成,也可以由很多人一起完成,那一起完成就是进程组,一个人完成就可以看成是进程组完成任务,也可以看成是进程完成任务
所以说其实这两个之间概念是差不多的,只不过是任务是一个偏用户的概念,而在实际的操作系统中完成任务是要依靠的是进程组来完成的,所以之前的描述中,在Linux中不叫前台后台进程,而是叫做是前台后台任务,在多数的情况下进程都是自称一组,但也有多个进程相互搭配的情况
更有趣的是,当进程组退出后,组内的后台进程依旧会存储下来
守护进程的创建原理
下面是执行守护进程的接口
守护进程的创建有一个条件,它本身不能是组长,所以一种处理方法是创建一个子进程,在子进程中执行对应的进程方法,而父进程立刻退出,使得造成的效果是这个子进程被领养,这是创建守护进程的一种思路
这里对于守护进程的描述就到这里,后续会有额外的样例,但不管怎么说,守护进程总结下来,本质上它也是一个孤儿进程,同时守护进程会自成进程组和自成会话,这样就能保证不会受到任何用户登录和注销的影响,从而实现守护进程化