进程A: 1 //processA.c文件 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <sys/shm.h> 5 #include <unistd.h> 6 #include <string.h> 7 #include <sys/types.h> 8 #include <sys/ipc.h> 9 #include <errno.h> 10 #include <pthread.h> 11 12 #define BUF_SIZE 4096 13 14 int main() 15 { 16 void *shm_addr = NULL; 17 char buffer[BUF_SIZE]; 18 pthread_mutex_t * sharedLock; 19 pthread_mutexattr_t ma; 20 21 int shmid; 22 // 使用约定的键值创建共享内存 23 shmid = shmget((key_t) 1234, BUF_SIZE, 0666 | IPC_CREAT); 24 printf(shmid : %u\n, shmid); 25 if (shmid < 0) 26 { 27 perror(shmget error!
Linux环境,4个版本的微信对比 LinuxWeChat 前言 Linux下的必备软件,非微信莫属。经过国内整个Linux社区这几年的努力,微信在在Linux下终于能用了。现在Linux下主流的微信版本有4个:Wine、Uengine、原生、麟卓。这几个版本恰好博主都用过,索性做个横向对比,供各位小伙伴选择参考。应该说明的是,因为4个版本不能同时使用,所以量化的对比参数的取法有待细化,以下结果是从用户使用的感观方面的比较。 另外,测试是在Deepin中进行的。大家要有心理准备,因为结果是令人意外的。
wine 版本 Deepin团队对这个版本优化的是不错的,稳定可靠、功能齐全。但这个版本最大的问题是比较耗资源,内存占用比较多,动不动就一两个G。正是因为这个原因,我才去找其它版本来用的。但它的好处在于,跟Windows PC版本的功能性上是一致的。但版本稍落后于Windows版本。但这差别不大,可以不算是问题这个版本最大的问题是比较耗资源,内存占用比较多。正是因为这个原因,我才去找其它版本来用的。但它的好处在于,跟Windows PC版本的功能性上是一致的。但版本稍落后于Windows版本。但这差别不大,可以不算是问题。
Uengine 版本 这也是Deepin团队优化的版本。令人意外的是,这个版本的资源消耗非常地小,小到你都不敢相信。尤其是在你用过其它版本后,再使用Uengine版本,这种感受更加强烈。这里必须为Deepin点赞! 但它的最大问题是,不能与本机自由交互资源,也就是你不能在桌面与微信间随意拖动、打开文件。你剪切板里的图片也粘不到微信里,相应的,别人发你微信的图片、文件,你也很难拷到桌面。这一点希望Deepin团队后续能优化吧。因为作为pc办公场景,这个需求可以称之为刚需。 而且,目前这个版本还有点不太稳定,开机使用时间长了之后,容易启动不起程序来。 麟卓 版本 这是基于xDroid方案的微信版本。使用体验跟Uengine版本很相似,不同的是,你需要先安装麟卓应用商店(应用环境),从商店安装微信。而麟卓应用商店是比较大的,且运行微信时,需要一直打开这个麟卓运行环境,有种不太利索的感觉。 不得不说,麟卓的微信相比Uengine的版本,是针对微信与PC间交互做过优化的,这方面体验有所提升。但资源占用比Uengine高很多,跟Wine版本有一拼。 这个版本仍然不能称为理想版本。
原生版本 这是微信官方的版本,也应该是广大Linux用户最为期待的版本。经过试用,我只能说~算了,我不能说脏话。大家往下看吧。 跟Windows下的微信相比,原生版本都不能称为阉割版本。因为它只保留了基本的消息发送与接收,除此之外,你能想到的功能,它全部没有。随便举几例:查找朋友、群里@朋友、引用消息、消息撤回、群昵称修改、群里查看朋友信息、语音及视频、定位、朋友圈、订阅号等等,以上功能都!没!有!朋友,看到这里,你想对麻花疼说什么? 但你要说它一点好处也没有,我是不同意的。得益于它功能简单,其它内存消耗是比较少的,在资源占用方面优于Wine、麟卓,但还弱于Uengine版本;另外,没有订阅信息、朋友圈等干扰,它更能让你聚焦于沟通...好了,我编不下去了。
结论 怎么样,兄弟们?看了这4个版本的微信,你还有力吐槽不?反正就现状来讲,最初最看不起的Wine版本反而是当下最好的选择。而要说最有潜力的,个人感觉是Uengine版本,对比使用下来,竟然比原生版本还省资源。这篇文章为不愿意折腾对比的小伙伴们提供下选择参考。当然,如果你有不同意见,或有更好方案,请评论区留言。
COALESCE 基本语法:coalesce(表达式1,表达式2,表达式3,...,表达式n) 实际应用中,表达式可以是1个或多个,表达式可以是字符串或者字段等。 当只有一个表达式时,表达式不能为空,即不能为coalesce(null);不过可以为空字符串,比如coalesce('') 常用来将null值转为0
-- 如果userid为空,则返回id2,... select COALESCE(userid,id2,id3) newid from table; to_char 1.保留小数 格式必须是9。 小数点位数前保留位数不足则####; to_char中的第二个参数的小数点后面位数高于第一个参数,会用0补齐; to_char中的第二个参数的小数点前面位数高于第一个参数,会用空格补齐;
select to_char(222.222222,'999.99') as 值 from dual 2.时间格式 select to_char(sysdate,'yyyy') from dual; -- 年 select to_char(sysdate,'Q' from dual; --季 select to_char(sysdate,'mm') from dual; --月 select to_char(sysdate,'dd') from dual; --日 连字符 || -- 22.22& select 22.22||'%' as 值 from dual
环境:
系统:centos7 x3
master:192.168.220.133
slave1:192.168.220.136
slave2:192.168.220.137
主从复制步骤思路 1.slave服务器上执行change master to ,启动start slave,主从复制启动 2.此时sql的io线程会通过(change master 指定的在master服务器授权的用户)请求连接master,并从指定的logbin文件的指定位置pos点,发送数据 3.master 收到io线程的请求,然后就会启动一个dump线程,分批读取logbin指定位置之后的语句发给你slave,除此之后,还给了下次我要用那个logbin和pos点 4.当slave io线程拿到logbin文件之后,就放在relaylog中,并且将master给的下次连接的logbin和pos点一起保存, 5.slave sql线程检测到relaylog有变化,就读取,并执行, 主从复制搭建的前提: 1、主从mysql版本一致 2、主库开启binlog日志(设置log-bin参数) 3、主从server-id不同
1、从库服务器能连通主库
[localhost~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent 2、主库和从库数据一致
3、主库在配置文件中开启二进制日志功能server-id不同:(vim /etc/my.cnf)
log-bin=mysql-binserver-id=1 2 #server-id不同 4、主库授权从库
格式:grant replication slave on *.* to '授权用户'@'从库IP' identified by '授权密码';mysql>grant replication slave on *.* to 'slave'@'192.168.0.*' identified by 'slave123'; 5、刷新策略
mysql>flush privileges; 6、master:查看日志文件
MySQL的安装与配置——详细教程 免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的
标准化语言,其特点为体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,在 Web
应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据
库管理系统)应用软件之一。
在本博文里,我主要以Mysql免安装版为例,帮助大家解决安装与配置mysql的步骤。
首先:要先进入mysql官网里(Mysql的官网-->https://www.mysql.com/),下面是详细步骤:↓
(为了方便大家的操作,我的网盘里有安装包:
链接:https://pan.baidu.com/s/1hq0rrtdXm2g7FqwaBKxgWg 提取码:wsh6 )
一、下载安装包: ①进入官网后,点击Dowload,然后页面往下拉
②接下来看到的页面是这样的,红色框框的链接就是mysql社区版,是免费的mysql版本,然后我们点击这个框框的链接:↓
③接下来跳转到这个页面,在这里,我们只要下载社区版的Server就可以了:↓
④下载免安装版(windows以外的其他系统除外)
***这样,安装包就下载好了!
***注意,安装的目录应当放在指定位置,,其次,绝对路径中避免出现中文,推荐首选英文为命名条件!!!!(我的为参考)
二、Mysql的配置 *以管理员身份打开命令行(如下图所示),一定要是管理员身份,否则由于后续部分命令需要权限,出现错误!
目录ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件整体文件结构介绍鉴权中心 + Nginx 文件夹:Nginx_AuthenticationCenterconfig文件夹appsettings.jsonkey.jsonnginx.confpubish文件夹主要存放项目的发布文件docker-composeDockerfile网关+Nginx文件夹:Nginx_GateWayconfig文件夹appsetings.jsonOcelotConfiguration.jsonnginx.confpublish文件夹存放项目的发布内容docker-composeDockerfileConsul+Nginx文件夹:Nginx_ConsulConfig文件夹nginx.confdocker-compose用户微服务文件夹:Userconfig文件夹appsettings.jsonpublish存放项目发布文件docker-composeDockerfile课程微服务文件夹:Lessonconfig文件夹appsettings.jsonpublish存放项目的发布文件docker-composeDockerfile各类Shell脚本文件authenticationcenter_svc.shgateway.shlesson_svc.shupdate.shmysql文件夹docker-compose
ASP.NET Core Ocelot+Consul+Nginx+JWT Linux服务器部署文件 整体文件结构介绍 项目文件夹:TestProject 鉴权中心 + Nginx 文件夹:Nginx_AuthenticationCenter config文件夹 publish文件夹 docker-compose Dockerfile 网关+Nginx文件夹:Nginx_GateWay config文件夹 publish文件夹 docker-compose Dockerfile Consul+Nginx文件夹:Nginx_Consul config文件夹 docker-compose 用户微服务文件夹:User config文件夹 publish文件夹 docker-compose Dockerfile 课程微服务文件夹:Lesson config文件夹 publish文件夹 docker-compose Dockerfile 各类SH脚本文件 authenticationcenter_svc.sh gateway_svc.sh user_svc.sh lesson_svc.sh update_svc.sh start_svc.sh 鉴权中心 + Nginx 文件夹:Nginx_AuthenticationCenter config文件夹 appsettings.
1.重启虚拟机
2.进入到该页面之后,选中第一个(高亮显示即为选中)选项,然后按下键盘的“E”键
3.进入到初始化脚本编辑页面,该脚本有两页,用下键向下拉,直到最后两行
4.光标拉到最后两行需要加入一些文字
shgb后面加入下面这一行文字rwLANG=\en_US.UTF-8后面加下面这一行文字init=/bin/sh
5.然后按ctrl+x退出
6.进入到下图页面之后(一开始只有上面那一行),表示初始化成功,然后依次输入
mount -o remount,rw /passwd root输入两次新的密码(密码不会直接显示出来)touch /.autorelabelexec /sbin/init
7.再重启虚拟机,输入新密码即可以登录。
目录ASP.NET Core Ocelot+Consul+Nginx+JWT 构建微服务鉴权中心鉴权中心 Common.AuthenticationCenterControllers文件AuthenticationController.csUtility 文件夹Model 文件夹User.csRSA 文件夹RSAHelper.csConfigInformation.csHttpHelperService.csIJWTService.csJWTHSService.csJWTRSService.csJWTTokenOptions.csappsettings.jsonkey.jsonProgram.cs网关 Common.OcelotGatewayappsettings.jsonOcelotConfiguration.jsonProgram.cs用户微服务 UserMicroserviceControllers文件夹UserController.csappsettings.jsonProgram.cs课程微服务 LessonMicroserviceControllers文件夹LessonController.csappsettings.jsonProgram.cs
ASP.NET Core Ocelot+Consul+Nginx+JWT 构建微服务鉴权中心 构建鉴权中心 通过webapi的形式给微服务颁发可以登录的有效JWT Token 构建用户微服务 管理用户信息 构建测试用微服务 构建网关层,对微服务进行转发和鉴权 使用Consul 进行服务的注册 发现 访问流程:
Nginx=>3个鉴权中心集群=》访问问User 微服务验证用户正确性=》验证成功鉴权中心颁发有效Token
Nginx=>(网管层)Ocelot 鉴权=》Consul(服务注册发现)=》测试微服务
鉴权中心 Common.AuthenticationCenter Controllers文件 AuthenticationController.cs 通过访问用户微服务的登录接口,如果登录成功就颁发JWT Token
[Route(api/[controller])] [ApiController] public class AuthenticationController : ControllerBase { #region MyRegion private ILogger<AuthenticationController> _logger = null; private IJWTService _iJWTService = null; private readonly IConfiguration _iConfiguration; private HttpHelperService _HttpHelperService = null; public AuthenticationController(ILoggerFactory factory, ILogger<AuthenticationController> logger, IConfiguration configuration , IJWTService service , HttpHelperService httpHelperService) { this.
实验网站 课程网站:CSAPP
源码下载 源码下载
实验文档下载
我的实验环境:Ubuntu 20.04
lab7文档解读 查看 tsh.c (tiny shell) 文件,您会看到它包含一个简单的 Unix shell 的功能骨架。为了帮助您入门,我们已经实现了不太有趣的功能。你的任务是完成下面列出的剩余的空函数。作为对您的健全性检查,我们在参考解决方案中列出了每个函数的大致代码行数(其中包含大量注释)。
eval: 解析和解释命令行的主要例程。[70行] builtin cmd:识别和解释内置命令:quit、fg、bg和jobs。[25行] do bgfg:实现bg和fg内置命令。[50行] waitfg: 等待前台作业完成。[20行] sigchld handler: 捕获SIGCHILD信号。[80行] sigint handler: 捕获SIGINT (ctrl-c) 信号。[15行] sigtstp handler: 捕获SIGTSTP (ctrl-z) 信号。[15行] Unix Shell 概述 shell 是一个交互式命令行解释器,它代表用户运行程序。 shell 反复打印提示,等待 stdin 上的命令行,然后按照命令行内容的指示执行一些操作。
命令行是由空格分隔的 ASCII 文本单词序列。命令行中的第一个单词要么是内置命令的名称,要么是可执行文件的路径名。剩下的词是命令行参数。如果第一个单词是内置命令,shell 会立即执行当前进程中的命令。否则,该词被假定为可执行程序的路径名。在这种情况下,shell 会派生一个子进程,然后在子进程的上下文中加载和运行程序。由于解释单个命令行而创建的子进程统称为作业。一般来说,一个作业可以由多个通过 Unix 管道连接的子进程组成。
如果命令行以 & 符号结尾,则作业在后台运行,这意味着 shell 在打印提示符并等待下一个命令行之前不会等待作业终止。否则,作业在前台运行,这意味着 shell 在等待下一个命令行之前等待作业终止。因此,在任何时间点,最多可以有一个作业在前台运行。但是,可以在后台运行任意数量的作业。例如,键入命令行
tsh> jobs 使shell执行内置的jobs命令。键入命令行T
tsh> /bin/ls -l -d 在前台运行ls程序。按照惯例,shell确保程序开始执行其主例程时
进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时又需要等待CPU服务,可见,进程的状态是会有各种变化。为了方便对各个进程的管理,操作系统需要将进程合理地划分为几种状态。
运行态:占有CPU,并在CPU上运行(注意:单核处理机坏境下,每一 时刻最多只有一个进程处于运行态。双核环境下可以同时有两个进程处于运行态) 就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行( 进程己经拥有了除处理机之外所有需要的资源,一旦获得处理机,即可立即进入运行态开始运行。即:万事俱备,只欠CPU) 阻塞态(等待态):因等待某一事件而暂时不能运行(如:等待操作系统分配打印机、等待读磁盘操作的结果。CPU是计算机中最昂贵的部件,为了提高CPU的利用率,需要先将其他进程需要的资源分配到位,才能得到CPU的服务) 创建态:操作系统需要完成创建进程。操作系统为该进程分配所需的内存空间等系统资源,并为其创建、初始化PCB(如:为进程分配PID) 终止态:操作系统需要完成撤销进程相关的工作。完成将分配给进程的资源回收,撤销进程PCB等工作。进程运行结束(或者由于bug导致进程无法继续执行下去,比如数组越界错误),需要撤销进程。
就绪态一>运行态:进程被调度 运行态一>就绪态:时间片到,或CPU被其他高优先级的进程抢占 运行态一>阻塞态:等待系统资源分配或等待某事件发生(主动行为) 阻塞态一>就绪态:资源分配到位,等待的事件发生(被动行为) 创建态一>就绪态:系统完成创建进程相关的工作 运行态一>终止态:进程运行结束,或运行过程中遇到不可修复的销误