【Linux】实现守护进程 | 以tcpServer为例
本文将以tcp服务器代码为基本,讲述如何将进程守护进程化,后台运行 1.守护进程 所谓守护进程,就是和其他进程没有关系的进程;其独立运行于系统后台,除非自己退出或收到信号终止,否则会一直运行下去 1.1 进程组 在我们使用的bash中,同一时刻只会有一个前台进程组 如图,当一个前台进程开始运行之后,我们没有办法在当前终端开启第二个前台进程。 在运行的命令后面加&,临时让当前进程在后台运行。注意,此时tcp虽然在后台运行了, 但对于它而言,stdin/stdout/stderr的文件描述符依旧指向的是当前bash的输入输出,所以它的日志依旧会打印到当前终端上。 用ps命令查看当前进程的信息,其中ppid是当前进程的父进程,也就是当前bash,pid是进程编号,pgid是进程的组编号,可以看到这个组编号和grep命令的组编号是不同的。 我们用这个c语言的代码调用两次fork,相当于创建了3个子进程。 1234567891011#include <sys/wait.h>#include <stdlib.h>#include...
【Linux】popen pclose接口介绍
本篇文章简单讲述了c语言接口popen/pclose的用法 1.函数作用 函数定义如下 1234#include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *stream); popen函数会创建一个管道,fork一个子进程,关闭管道的不使用端,通过exec函数执行一个shell命令,等待命令终止。并将命令的输出结果通过管道返回给当前的进程; 1.1 popen popen函数会创建一个管道,fork后调用shell来打开进程。由于管道的定义是单向的,第二个参数type只能指定读或写,不能同时指定读和写; 所得到的管道相应地是只读或只写的 The popen() function opens a process by creating a pipe, forking, and invoking the shell. Since a pipe is by definition unidirectional, the type argument...
【C++】using的三种用法 | 转载
C++ using的三种用法,这个之前还没有接触过 示例 12345678910111213141516171819202122232425262728293031#include <iostream>using namespace std;class ClassOne {public: int w;protected: int a;};class ClassTwo{public: using ModuleType = ClassOne;};template <typename ClassType>class ClassThree : private ClassType{public: using typename ClassType::ModuleType; ModuleType m; ClassThree() = default; virtual ~ClassThree() = default;};void main(){ ...
【Linux】来写一个tcp的服务端+客户端
今天让我们来写一个tcp的服务器/客户端代码 完整代码见我的gitee 连接 阅读本文前,建议先阅读👉 udp服务器 1.基本框架 tcp的服务器和udp服务器初始化接口是非常相似的,区别就在于要选择字节流进行初始化 但是到运行状态就不同了 tcp是需要连接的 udp不需要连接 所以就会出现分歧:udp可以用sendto和receve来发送/接收信息,服务端只需要监听特定端口收到了什么信息; 但tcp并不能这么做,在通信之前,tcp服务器必须要和客户端建立链接。 举个不恰当的例子,udp服务器好比一个水盆,等待水的注入;而tcp服务器是个水管,必须要两头连通了,才能开始注水 1.1 类成员 类的成员变量和udp很相似,都是需要服务器的ip、端口、sockfd这些信息。为了更容易区分,将tcp服务器的socket fd改为_listenSock,意为监听端口 1234567891011class TcpServer{private: // 服务器端口号 uint16_t _port; // 服务器ip地址 string _ip; ...
【Python】自动解析markdown中的图片并保存
python自动化下载/上传md中图片实在是太方便了 1.起因 为什么需要python来下载md里面的图片?原因很简单,那就是需要把图片保存下来,上传到第二个图床(迁移) 对于阿里云OSS来说,有两种迁移办法 使用官方的数据导出功能 使用api接口遍历oss目录下载所有图片 这两种办法都不是那么方便,所以我选择了第三种 解析本地md文件中的img url,下载图片并保存到本地 那要怎么做呢?👇 2.教程 我在github找到了这个项目 👉 Deali-Axy/Markdown-Image-Parser 作者的代码写的很棒,但是README里面却少了一个重要的启动教程,那就是你需要在当前目录下创建一个files文件夹(md文件放到这里面),对应启动项里面开启的根目录 12if __name__ == '__main__': files_list = get_files_list(os.path.abspath(os.path.join('.', 'files'))) 随后,执行python...
【Docker】配置wiki js
wikijs是一个在线多人协作(带git版本管理)的wiki套件 相比于其他wiki的展示功能为主,wikijs将权限管理+多人协作作为了首个要素,其支持富文本编辑器/mardown编辑器/html源码编辑 1.Docker-cli部署 在云服务器安装 https://docs.requarks.io/install/ubuntu 可以跟着官方的指令走,下面节选了最终3个创建容器的命令。 配置密钥 12345678910mkdir -p /etc/wiki## Generate DB secretopenssl rand -base64 32 > /etc/wiki/.db-secret## Create internal docker networkdocker network create wikinet## Create data volume for PostgreSQLdocker volume create pgdata 配置数据库 1234567891011docker create \ --name=db \ -e...
【C语言】可变参数列表
本篇博客让我们来认识一下C语言学习过程中往往被忽略的可变参数列表 所谓可变参数,就是一个不限定参数数量的函数,我们可以往里面传入任意个数的参数,以达成某些目的。 关联:C++11可变模板参数 1.函数 123456#include <stdarg.h>void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);void va_copy(va_list dest, va_list src); 1.1 va_start 1void va_start(va_list ap, last_arg); ap: 这是一个 va_list 类型的对象,它用来存储通过 va_arg 获取额外参数时所必需的信息 这个函数的作用是初始化 ap 变量,它与 va_arg 和 va_end 函数一起使用。 last_arg 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。 要想设置一个带可变参数的函数,函数声明是下面这样的 1void test(int...
【Linux】来写一个udp的服务端+客户端
来写一个udp的代码 1.socket编程接口 123456789101112131415161718#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address, socklen_t address_len);// 开始监听socket (TCP, 服务器)int listen(int socket, int backlog);// 接收请求 (TCP, 服务器)int accept(int socket, struct sockaddr* address, ...
【Linux】man什么都搜不了,No manual entry for xxx的解决方案
man什么都搜不了,No manual entry for xxx的解决方案 系统 CentOS 7.6 1.问题描述 今天查手册的时候,发现man什么都查不了。不管是系统接口还是函数,都显示没有入口文档(No manual entry for) 12345678[muxue@bt-7274:~/git]$ man pthread_createNo manual entry for pthread_create[muxue@bt-7274:~/git]$ man bindNo manual entry for bind[muxue@bt-7274:~/git]$ man manNo manual entry for man[muxue@bt-7274:~/git]$ man lsNo manual entry for ls 这可得难受了,要知道,我的博客里面关于接口定义的说明,很多都是从man手册里面复制出来的。 在root下尝试了安装,并yum update更新之后,还是无法使用 于是我就去stackoverflow提了个问题 【点我】...
【Linux】CentOS7.6 升级 gcc/g++
CentOS 7.6 升级 gcc/g++的方法,不一定适用于其他linux系统 1.查看版本 12g++ -vgcc -v 当前查看版本,发现是4.8.5,这已经是2015年的旧版本了,对c++11的支持不是很完善,为了方便学习和编写新版本的代码,升级一下还是可以的 如果你的系统上没有gcc/g++,则尝试用下面的方法安装 1yum install -y gcc gcc-c++ 示例 123456789101112[root@bt-7274:~]# yum install -y gcc gcc-c++Loaded plugins: fastestmirror, langpacks, product-id, search-disabled-repos, subscription-managerThis system is not registered with an entitlement server. You can use subscription-manager to register.Repository epel is listed more than once...