linux网络版计算机

2023-12-19


前言


一、网络版计算机

1.序列化与反序列化

协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢?
例如, 我们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端。

约定方案一:
客户端发送一个形如"1+1"的字符串;
这个字符串中有两个操作数, 都是整形;
两个数字之间会有一个字符是运算符, 运算符只能是 + ;
数字和运算符之间没有空格;

约定方案二:
定义结构体来表示我们需要交互的信息;
发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按照相同的规则把字符串转化回结构体;
这个过程叫做 “序列化” 和 “反序列化”

2.网络版计算机实现

下面我们就采用约定方案二来指定一个网络版计算机传输数据的协议。
我们先来实现一个Sock套接字类,该类封装了创建套接字,绑定套接字等一些接口,以方便构建服务器使用。
在这里插入图片描述
然后我们使用刚刚封装的Sock接口来创建一个TcpServer。在TcpServer中每当有一个连接时,我们就创建一个线程来处理这个连接请求。我们应该在线程回调函数ThreadRoutine中调用用户向该服务器传入的需要执行的函数func_。但是因为ThreadRoutine函数为静态成员函数,不能访问非静态成员变量,所以我们无法在ThreadRoutine函数中调用func_。
在这里插入图片描述
我们可以采用下面的解决办法,我们在要传递给线程回调函数的参数类型ThreadData中封装一个TcpServer * 类型的指针,然后当ThreadRoutine函数收到参数后,根据传进来的TcpServer * 类型的指针来调用TcpServer对象的成员函数就可以了。这样我们就解决了静态成员函数ThreadRoutine调用TcpServer对象的非静态成员函数的问题。可以看到,我们在Excute函数中调用了TcpServer对象的func_函数,这样在ThreadRoutine函数中,每个线程就可以通过TcpServer * 指针来调用Excute函数来执行func_函数了。
在这里插入图片描述
如果我们向让TcpServer做一系列操作的话,那么我们可以创建一个vector容器,然后将函数都添加到vector容器中,然后可以调用TcpServer对象的BindHandler函数来添加一个函数,也可以调用TcpServer对象的Excute函数来执行vector容器中的所有函数。我们还可以将每个操作都进行命名,那么我们就需要使用map容器来存储操作名和对应的操作函数了,在调用TcpServer对象的BindHandler函数添加函数时需要为这个操作传入一个名称。
在这里插入图片描述
然后我们基于TcpServer再来搭建计算器服务器。我们先在TcpServer服务器中添加一个debug函数来测试服务器是否可以成功执行添加的debug函数。
在这里插入图片描述
然后我们编写makefile文件后开始进行测试。
在这里插入图片描述
我们看到CalServer服务器收到了客户端发来的消息,即TcpServer服务器执行了CalServer中的debug函数,因为debug函数只是打印一个字符串,所以当这个debug执行完后就关闭了这次连接。
在这里插入图片描述
下面我们将calculator函数添加到TcpServer函数中,calculator函数以后就用来处理客户端发送过来的计算请求。
在这里插入图片描述
下面我们再来手动进行协议定制,我们在Protocol中进行协议的定制,我们规定客户端的计算请求由一个Request类对象来描述,该对象的x_ 和 y_成员变量表示计算的两个操作数,op_成员变量表示计算的操作符。服务器返回一个Response类对象来表示计算结果,该对象的result_成员变量就是计算结果,code_成员变量标识这次计算是否出现了错误。
在这里插入图片描述
通过上面的描述我们知道了客户端发送的请求为一个Request类类型对象,二服务器返回的结果是一个Response类类型的对象。我们在前面只学习了通过套接字传递字符串,所以我们可以先在客户端将Request类类型对象转换为字符串,然后再通过套接字传递给服务器这个字符串。将Request类类型对象转换为字符串的过程就可以称为序列化。服务器收到客户端发送的字符串后,再通过某种规则将这个字符串解析还原为Request对象,即将字符串转换为Request对象,这个过程就是反序列化。服务器拿到Request对象后进行计算,然后将计算结果封装到一个Response对象中,当服务器将Response对象传递给客户端时,也需要先将Response对象转换为字符串然后放到套接字中进行传递,即先将Response对象进行序列化。然后客户端从套接字中收到服务器返回的字符串后,需要先根据定制好的规则将这个字符串解析为Response对象,然后拿到该对象中保存的运算结果和运算结果状态码,这个过程就是反序列化。
在这里插入图片描述
下面我们先实现Request类的序列化函数Serialize函数。下面的实现使用条件编译的原因是因为我们先实现自己定制的序列化和反序列化函数,但是后面我们还会使用其它已经写好的序列化和反序列化函数,条件编译方便了以后序列化使用自己写的函数还是使用其它已经写好的函数。我们自己定义的序列化函数是将操作数x_与操作符中间添加一个空格,然后将操作符与操作数y_之间添加一个空格,然后将这个string对象返回即可。需要注意的是因为op_已经为一个字符了,所以我们不需要使用to_string来将这个字符转换为字符串,因为to_string会将字符op_的ASCII码转换为字符串。例如字符op_如果为+号,+号的ASCII码为43,那么to_string(op_)就会将43转换为字符串。
在这里插入图片描述
下面我们再来实现Request类的反序列化函数Deserialized函数,我们以空格为分隔符,将字符串中包含的x_、y_、op_都解析出来。
在这里插入图片描述
然后我们再来使用Response类的序列化和反序列化函数。
在这里插入图片描述
然后我们再实现Recv函数和Send函数,Recv函数会从套接字文件中读取数据并返回。Send函数会将数据写到套接字文件中。
在这里插入图片描述
然后我们再来实现CalServer服务器中的处理计算的函数calculator。在calculator函数中通过calculatorHelper函数来进行计算。
在这里插入图片描述
下面我们来实现calculatorHelper函数。
在这里插入图片描述
这样我们就简单的实现了CalServer,下面我们来实现CalClient客户端程序。
客户端不需要bind绑定,但是需要连接到服务器,所以我们还需要在Sock类中添加一个Connect连接服务器的接口。
在这里插入图片描述
然后我们来实现客户端,我们让客户端每1秒将一个计算式发过去,然后打印出来服务器发送回来的计算结果。
在这里插入图片描述
我们看到测试的结果和我们预期的一样。
在这里插入图片描述
下面我们将客户端改为用户输入,然后让服务器计算用户输入的算式,将答案返回给用户。
在这里插入图片描述
在这里插入图片描述
但是我们的服务器还存在bug,当我们将客户端退出后,服务器也出错并且退出了,这是肯定不行的。这是因为当我们将客户端退出后,此时客户端就断开连接并且不会向sock套接字中写入数据了,并且也不会读取数据了,而在CalServer服务器中还会调用Recv函数从套接字文件中读取数据,因为此时套接字文件的写端客户端已经关闭了,所以Recv会读到空字符串并且返回给服务器,然后服务器将空字符串解析出来计算结果,此时虽然没有解析出来Request对象,但是Request对象的x_和y_都为随机值,所以也会计算出来一个结果,然后将这个结果写入到套接字中,但是这一步就会出错,因为此时套接字文件的读端客户端已经关闭了,而服务器还向这个套接字文件中写入数据就会产生SIGPIPE信号了,即操作系统不允许这样的情况出现,所以服务器就出错了。
在这里插入图片描述
下面我们来解决这个问题,我们先在服务器中判断从Recv函数中是否读取到了数据,如果读取到了数据就向下执行计算的操作,如果没有读取到数据就不再进行数据读取。因为此时客户端已经退出了,所以将服务器的处理请求的线程也退出。然后我们看到此时服务器就不会出现错误了。
在这里插入图片描述
在这里插入图片描述
但是我们上述还没有彻底解决问题,因为以后可能会出现这样的情况,当服务器想要给客户端send返回数据时,而此时客户端退出了,那么服务器就会产生非法写入的问题,即文件的读端已经关闭,写端还要写入数据那么就会发生非法写入的问题。所以我们一般都要让服务器忽略SIGPIPE信号,这样当产生上面的情况时,服务器并不会崩溃。这样的情况是我们在写服务器时经常遇到的情况,所以需要特别注意。
在这里插入图片描述
我们的程序还会存在一个问题,即我们不能保证Recv函数每次读取的就是一条完整的计算式字符串。因为TCP通信是面向字节流的,即什么样的字符串组合都有可能被读取到。例如读取到" 1234 + 5678 / 334 * "这样的字符串,这样的字符串在进行反序列化时就会出现错误。所以我们的Recv函数中并不能保证每次读取的都是一个完整完善的请求。
下面是面向字节流通信,send等系统调用接口其实就是将buffer里面的数据拷贝到客户端的发送缓存区中,然后由发送缓冲区来将数据发送到网络中。在服务器中有一个接收缓冲区,该缓冲区中存放的是服务器从网络中读取的数据,recv等系统调用接口其实就是将接收缓冲区里面的数据拷贝到服务器的buffer中。发送缓冲区和接收缓冲区是面向字节流通信的,即通信的数据并不是每次都是一个请求,有可能客户端发送了很多个请求,然后发送缓冲区等满了之后才发送,读取缓冲区也并不是每次读取一个请求,而是读取一大串字节流数据。所以我们就不能保证读取时每次都读取到一个完善完整的请求。所以我们需要对协议进行进一步的定制。
在这里插入图片描述
我们首先需要在客户端发送的序列化好的数据中做改动,即不能让客户端只发送计算式组成的字符串,应该在这个字符串的前面和后面加一些分隔符来区分这个计算式字符串,然后在前面加上计算式字符串的长度,这样来表示一次请求,这样进行封装的话可以更好的区分客户端发来的一个请求。
在这里插入图片描述
然后我们改变Recv函数,判断Recv函数调用recv系统调用的执行结果,如果读取到了数据就返回true表示这次读取到了数据,如果没有读取到数据或者写端已经关闭就返回false,表示这次没有读取到数据。如果读取到了数据就会追加到输出型参数out中。即Recv函数就用来处理读取数据和对写端进行判断,如果文件中还有数据并且写端没有关闭,那么就读取数据并且将数据追加到out中然后返回true,如果写端关闭或者读取失败就返回false。
在这里插入图片描述
然后我们在CalServer服务器的处理请求的calculator函数中先调用Recv函数进行读取数据,如果从套接字文件中读取数据都失败了,那么说明客户端已经关闭了,所以服务器就可以直接退出这一次处理函数了。如果Recv函数读取到了数据,那么就调用Decode函数来从inbuffer读取的数据中解析一个完整完善的请求报文,如果没有解析出来就说明inbuffer中没有包含完整完善请求报文的数据,那么可以继续从套接字文件中进行数据读取。如果Decode函数返回的package不为空,那么就说明package中此时已经有且仅有一个完整完善的请求报文,然后下面就可以对这个请求报文进行处理了。
在这里插入图片描述
然后我们来实现Decode函数,我们控制Decode函数只有分析到一个完整完善的请求报文时才进行数据返回,如果没有分享到完整完善的报文,那么就返回空字符串。
在这里插入图片描述
在这里插入图片描述
这样我们就保证了服务器获取请求报文并进行计算时不会出现问题,但是当服务器返回处理好的结果时,我们也需要将这个结果进行序列化,然后将序列化好的字符串调用Encode函数进行封装,Encode会返回一个完整的返回报文。然后再调用Send函数将这个完整完善的返回报文写到套接字文件中。
在这里插入图片描述
下面我们来实现Encode函数,Encode函数就是将有效字符串的前面加上长度信息,然后通过SEP分隔符来将有效字符串分割开。需要注意的是请求报文和返回报文都可以使用Decode函数来进行解析有效字符串,都可以使用Encode函数来进行封装有效字符串。
在这里插入图片描述
下面我们再来将客户端发送请求报文和接收返回报文的处理也进行修改。其中quit变量用来控制客户端是否关闭,当服务器关闭时,客户端读取返回数据就会失败,然后改变quit为true,那么就不会进入下一次循环来让用户输入计算式了,即客户端就关闭了。
在这里插入图片描述
经过测试我们看到客户端和服务器可以正常运行并且进行通信。
在这里插入图片描述
下面我们在服务器中打印出来封装前和封装后,解析前和解析后的数据来进行观察。
在这里插入图片描述
然后我们在客户端中将用户输入的格式改变,然后再判断服务器返回的结果中的code_错误码来打印出对应的错误信息,如果没有错误就打印出计算的结果。
在这里插入图片描述
通过测试我们就可以看到客户端和服务器更加完善了。
在这里插入图片描述
下面我们再来将服务器输出到显示器中的信息改为输出到日志文件中。我们看到服务器的一些输出信息都在日志文件中了。
在这里插入图片描述
在这里插入图片描述

3.守护进程

现在我们的服务器进程为一个前台进程,即该进程和终端关联,当运行这个进程时,在命令行输入其它命令时是无效的。但是这样的前台进程当我们退出这一次登录时,这个进程也会关闭,那么我们的服务器进程运行时也会被退出,这肯定是不行的,因为服务器进程只要运行了就不能再退出的。所以此时我们就需要将服务器进程变为一个守护进程。

1.前台进程:和终端进程关联的进程。
2. 任何xshell登录,只允许一个前台进程和多个后台进程。
3. 进程除了有自己的pid,ppid,还有一个组ID。
4. 在命令行中,同时用管道启动多个进程,这多个进程是兄弟关系,父进程都是bash->可以用匿名管道来进行通信。
5. 而同时被创建的多个进程可以成为一个进程组的概念,这个进程组的组长一般是第一个进程。
6. 任何一次登录的用户,需要有多个进程组来给这个用户提供服务的(bash),用户自己也可以启动很多进程或者进程组,我们把给用户提供服务的进程或者用户自己启动的所有的进程或者进程组整体属于一个叫做会话的机制中。
7. 那么我们在bash命令行中启动的服务器进程也属于这个会话,如果我们将这次登录退出,那么这个会话中的所有进程都会被退出,即服务器进程也会被退出。所以我们需要将服务器进程自成一个会话,变为守护进程,那么当我们退出这一次登录时,自成一个会话的服务器进程就不会退出了,这就是守护进程。

在这里插入图片描述
在这里插入图片描述
但是setsid要成功被调用,必须保证当前进程不是进程组的组织,所以我们就需要先使用fork让服务器进程不为第一个进程。下面我们来使用代码实现将服务器进程变为守护进程。
在这里插入图片描述
然后我们在启动CalServer服务器时先将这个进程变为守护者进程。
在这里插入图片描述
我们看到此时服务器进程server的父进程的pid为1,此时server进程已经自成一个会话了,我们退出xshell这次登录然后再次登录时,这个server进程还在运行,因为我们没有关闭server进程的会话,所以server进程就可以一直运行了。此时我们想要关闭server进程就只能通过kill命令和pid来将server进程关闭了。 守护进程本质是孤儿进程的一种,它与孤儿进程不同的就是守护进程自成一个会话。
在这里插入图片描述
在这里插入图片描述

4.json格式

上面我们用自己实现的协议进行了序列化和反序列化,但是我们自己实现的序列化和反序列化肯定是不完善的,所以我们下面来使用JSON格式。
因为json不是c++自带的类型,所以如果我们想要使用json类型,就需要先下载json库。下面我们来安装jsoncpp库。

sudo yum install jsoncpp-devel

在这里插入图片描述

JSON(JavaScript ObjectNotation)是一种轻量级的数据交换格式,常用于在不同系统之间传输和存储数据。它具有以下特点:

  1. 可读性:JSON使用文本格式表示数据,易于阅读和理解。它采用了类似于JavaScript对象的键值对的形式来组织数据。
  2. 简洁性:JSON的语法非常简洁,相比于其他数据格式(如XML),它的数据表示更为紧凑,节省了传输和存储空间。
  3. 支持多种数据类型:JSON支持多种基本数据类型,包括字符串、数字、布尔值、数组、对象和null。这使得JSON非常灵活,可以表示各种类型的数据结构。
  4. 易于解析和生成:JSON数据可以轻松地由各种编程语言解析和生成。许多编程语言都提供了内置的JSON解析器和生成器,使得处理JSON数据变得简单和方便。
  5. 跨平台和语言无关:由于JSON是一种通用的数据格式,它不依赖于任何特定的平台或编程语言。这意味着JSON可以在不同的系统和不同的编程语言之间进行数据交换和共享。
  6. 可扩展性:JSON支持嵌套结构,允许在对象中嵌套其他对象或数组,从而实现复杂的数据结构。这种嵌套结构可以实现数据的层级关系和组织。
  7. 平台无关的数据交换格式:由于JSON的广泛支持和普及性,它已成为一种通用的数据交换格式。许多Web服务和API都使用JSON作为数据交换的标准格式。

例如下面表示一个包含个人信息的JSON对象。它包括名称、年龄、是否是学生、兴趣爱好和地址等属性。注意JSON中使用双引号表示键和字符串值,使用逗号分隔不同的键值对,使用方括号表示数组,使用花括号表示对象。

{
  "name": "John",
  "age": 18,
  "isStudent": true,
  "hobbies": ["runing", "traveling"],
  "address": {
    "street": "999 Main St",
    "city": "hangzhou"
  }
}

基本语法:

①.Json 键值对:键值对是 Json 的基本构成。其中,名称即对象的属性名称,必须包含在双引号( " " )中;值即对象对应的属性值;名称和值之间用冒号( : )隔开。
②.Json 值:Json 的值可以是以下几种:字符串、数字( 整型、浮点型 )、布尔值( ture、false )、空值( null )、数组、对象。
③.Json 对象:Json 对象是用大括号( {、} )括起来的一系列 Json 键值对的集合,键值对之间用逗号( , )隔开。
④.Json 数组:Json 数组是用中括号( [、] )括起来的一系列 Json 值的集合,值之间用逗号( , )隔开。

下面我们来使用json数据格式写一个测试程序。
下面为使用json来将数据进行序列化,我们使用了StyleWriter对象的write来将json对象转为字符串,可以看到下面的结果就是序列化之后的json对象。并且我们需要注意,因为我们使用了json库中的方法和变量等,所以我们在编译时需要加上jsoncpp库。
在这里插入图片描述
在这里插入图片描述
下面我们再使用FastWriter对象的write方法将json对象序列化为字符串,我们看到此时序列化之后的字符串没有了多余的空格和换行,变得更精简了。
在这里插入图片描述
我们还可以把一个json对象放到另一个json对象中。
在这里插入图片描述
在这里插入图片描述
下面我们就将网络版计算机中的序列化和反序列化的过程使用json库提供的序列化和反序列化方法实现。
json库的头文件在jsoncpp/json文件夹下,所以我们需要将路径都包含清楚。
在这里插入图片描述
下面我们将Request类的序列化和反序列化函数中使用了json库提供的序列化和反序列化方案,我们看到使用json库提供的方法更简便了。
在这里插入图片描述
然后我们也将Response类中的序列化和反序列化操作使用json库提供的方法。
在这里插入图片描述
我们看到使用json库题库的序列化和反序列化方案的话,那么在客户端中我们就没有打印出用户输入的计算式。
在这里插入图片描述
我们此时可以在协议中做扩展,在Response类中也将计算式的内容存储。那么我们在访问Response类对象时也可以访问到用户输入的计算式了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后我们进行测试就可以看到,用户输入的计算式也被打印出来了。到此我们就简单实现了一个网络版计算器。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux网络版计算机 的相关文章

  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 如何在两个不同帐户之间设置无密码身份验证

    我们可以在两台机器的两种不同用途之间设置无密码身份验证吗 例如 计算机A有用户A 计算机B有用户B 我们可以设置密码 ssh 以便计算机 A 上的用户 A 使用其用户帐户 A 登录计算机 B 谢谢你 如果我理解你的问题 你能设置一下吗ssh
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • 如何仅将整个嵌套目录中的头文件复制到另一个目录,在复制到新文件夹后保持相同的层次结构

    我有一个目录 其中有很多头文件 h 和其他 o 和 c 文件以及其他文件 这个目录里面有很多嵌套的目录 我只想将头文件复制到一个单独的目录 并在新目录中保留相同的结构 cp rf oldDirectory newDirectory将复制所有
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • 如何在我的 AWS EC2 实例上安装特定字体?

    我有一个在 AWS EC2 Amazon Linux Elastic Beanstalk 实例上运行的 Python 应用程序 该实例需要某些特定字体才能生成输出 并且想知道如何在部署或实例启动过程中安装它们 我的代码在本地计算机 OS X
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a

随机推荐

  • 边缘计算:构建下一代计算基础设施的关键技术

    随着物联网 人工智能和大数据等技术的快速发展 对计算基础设施的需求越来越高 然而 传统的云计算模式存在延迟高 数据传输量大等问题 为了解决这些问题 边缘计算应运而生 本文将介绍边缘计算的概念 探讨其在构建下一代计算基础设施中的关键技术 什么
  • BENTLY 125720-01 后卡模块

    BENTLY 125720 01 后卡模块 BENTLY 125720 01 后卡模块 产品详情 Bently Nevada 的产品 尤其是振动监测和机械振动解决方案 具有以下可能的特点 高精度测量 Bently Nevada 的产品通常设
  • 做一个wiki页面是体验HTML语义的好方法

    HTML语义 如何运用语义类标签来呈现Wiki网页 在上一篇文章中 我花了大量的篇幅和你解释了正确使用语义类标签的好处和一些场景 那么 哪些场景适合用到语义类标签呢 又如何运用语义类标签呢 不知道你还记不记得在大学时代 你被导师逼着改毕业论
  • git commit提交代码时 提交类别 - 提交开头命名规范

    feat 新功能 feature fix 修补bug refactor 重构 即不是新增功能 也不是修改bug的其他代码改动 style 格式 不影响代码运行的变动 test 增加测试 docs 文档 documentation chore
  • 20231219_101701 java io演练 功能演练 保存学生姓名到记事本

    需求 程序启动后 向用户询问学生姓名 如果输入的内容是s 就保存并退出 当程序结束后 把所有的输入的学生姓名 保存到名为students txt的记事本中 一个学生的名字占一行 分析 因为接收的是中文名字 所以建议使用字符流 我们随意选择一
  • 【数据结构和算法】 K 和数对的最大数目

    其他系列文章导航 Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一 题目描述 二 题解 2 1 方法一 双指针排序 三 代码 3 1 方法一 双指针排序 3
  • 20231219_093920 java 字符流写数据 FileWriter

    说明 FileWriter比起FileOutputWriter要更加好用 后者使用的时候还需要一个FileOutputStream对象 前者直接使用 示例 定义对象 FileWriter fileWriter new FileWriter
  • 比 style gan 更好的 style gan2

    上一篇博客介绍了 style gan 原理 但是 style gan 的结果会有水珠伪影 作者实验后发现是 Adain 导致的 AdaIN对每一个feature map的通道进行归一化 这样可能破坏掉feature之间的信息 当然实验证明发
  • 【工具库推荐】小程序一款阳历阴历(农历)日历组件

    展示 使用方法 组件目录如上图 调用如下图 第一步 在pages rl index json中设置引用这个日历组件 代码如下 第二步 在需要调用页面wxml文件中引用这个日历组件 并绑定相应的属性 如下图 属性解释 showDatePick
  • 策略模式在数据接收和发送场景的应用

    其他系列文章导航 Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一 策略模式改进 1 1 策略模式的定义 1 2 策略模式的结构通常包括以下组成部分 1 3
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • 高可用:如何实现消息队列的 HA?

    管理学上有一个木桶理论 一只水桶能装多少水取决于它最短的那块木板 这个理论推广到分布式系统的可用性上 就是系统整体的可用性取决于系统中最容易出现故障 或者性能最低的组件 系统中的各个组件都要进行高可用设计 防止单点故障 消息队列也不例外 本
  • 开源Cloudreve云盘系统源码/ 支持本地储存+对接各大对象储存/带云盘系统安装教程/公私兼备网盘系统

    源码介绍 Cloudreve云盘系统源码 它不仅支持本地储存 而且还对接各大对象储存 附带云盘系统安装教程 轻松搭建个人网盘 拥有美观界面 云盘系统安装教程 公私兼备网盘系统 多功能仿百度网盘源码 测试环境 PHP7 1 MYSQL5 6
  • 20231219_095713 java 字符缓冲输出流 BufferedWritter

    示例 关闭资源的时候 先关缓冲流 再关字符流 定义字符缓冲输出流对象 FileWriter fileWriter new FileWriter b txt BufferedWriter bufferedWriter new Buffered
  • 聊聊如何实现热插拔AOP

    前言 之前偶然看到一篇文章 利用aop实现热拔插 类似于插件 里面的实现挺好玩 今天我们也来玩一把 前置知识 Advice org aopalliance aop Advice 通知 表示 Aspect 在特定的 Join point 采取
  • 题解 | #输出某一年的各个月份的天数#

    三方寄过去了 告诉我停止24届招聘 全部毁约 牛的 he芯 毁约应届生 34316 广西北部湾银行2022年校园招聘 广西北部湾银行股份有限公司2022届校园招聘 看终端大把大把15级的 这个14级是不是终端bg的白菜了 程序员面试六战六捷
  • 永久删除的文件如何恢复?这3个简单方法可以帮到你!

    我在清理电脑的过程中 一不小心就删除了一些很重要的文件和数据 很想通过某种方法将这些数据找回来 但是不知道应该如何操作 有朋友可以分享一下文件找回的简单方法吗 在日常生活和工作中 我们时常会遇到误删重要文件的情况 一旦文件被永久删除 很多人
  • Mybatis配置-插件(plugins)

    MyBatis允许在映射语句执行的某些点拦截方法调用 默认情况下 MyBatis允许插件拦截以下方法调用 Executor update query flushStatements commit rollback getTransactio
  • 我的创作纪念日365

    机缘 提示 可以和大家分享最初成为创作者的初心 例如 实战项目中的经验分享 日常学习过程中的记录 通过文章进行技术交流 收获 提示 在创作的过程中都有哪些收获 例如 获得了多少粉丝的关注 获得了多少正向的反馈 如赞 评论 阅读量等 认识和哪
  • linux网络版计算机

    文章目录 前言 一 网络版计算机 1 序列化与反序列化 2 网络版计算机实现 3 守护进程 4 json格式 前言 一 网络版计算机 1 序列化与反序列化 协议是一种 约定 sock