char函数

muduo网络库学习——日志系统

允我心安 提交于 2020-03-03 00:51:41
日志的使用方式: LOG_INFO << "AAA"; LOG_INFO是一个宏,展开后为: muduo::Logger(__FILE__, __LINE__).stream() << "AAA"; 构造了一个匿名对象Logger,在这个对象构造的时候其实已经写入了文件名和行号。 匿名对象调用.stream()函数拿到一个LogStream对象,由这个LogStream对象重载<<将“AAA”写入LogStream的数据成员FixBuffer对象的data_缓冲区内。 匿名对象在这条语句执行完毕以后会被销毁,因此会调用~muduo::Logger()函数将日志消息输出至目的地(标准输出或者磁盘的日志文件); 日志的流程: Logger——Impl——LogStream——operator<<——LogStream的FixBuffer内——g_output——g_flush 高性能日志(异步日志)所在: 由于磁盘IO是移动磁头的方式来记录文件的,其速度与CPU运行速度并不在一个数量级上。因此业务线程中应该避免进行磁盘IO以防止业务得不到及时的处理。 在多线程程序中,业务线程应该专注与其业务逻辑的运算,用另外一个独立的线程来将日志消息写入磁盘。 在muduo的日志系统中,分为前端和后端。前端是业务线程产生一条条的日志消息。后端是日志线程,将日志消息写入文件。 业务线程有多个

Android.Hook框架Cydia篇

∥☆過路亽.° 提交于 2020-03-02 19:49:23
Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java函数,因此Cydia Substrate是一款强大而实用的HOOK工具. 官网地址:http://www.cydiasubstrate.com/ 官方教程:http://www.cydiasubstrate.com/id/38be592b-bda7-4dd2-b049-cec44ef7a73b SDK下载地址:http://asdk.cydiasubstrate.com/zips/cydia_substrate-r2.zip 0x00Hook Java 层 之前讲解过 xposed 的用法为啥还要整这个了,下面简单对比两款框架.想了解之前 xposed 篇的可以看这里: http://drops.wooyun.org/tips/7488 劣势 : 没啥错误提醒,排错比较麻烦. 需要对 NDK 开发有一定了解,相对 xposed 模块的开发学习成本高一些. 因为不开源网上(github)上可以参考的模块代码很少. 优势: 可以对 native 函数进行 hook . 与 xposed hook 原理不一样,因为不是开源具体原理我也不清楚. 结果就是一些Anti hook 可能对

MySQL 中的数据类型介绍

。_饼干妹妹 提交于 2020-03-02 19:32:16
1、概述 要了解一个数据库,我们也必须了解其支持的数据类型。 MySQL支持所有标准的SQL数据类型,主要分3类: 数值类型 字符串类型 时间日期类型 另一类是几何数据类型,用的不多,也没多介绍。 下面大、小标题后括号内的数组表示其含有的类型个数。下面所有结论都经过本人使用MySql Workbench编写SQL验证过或来自官网。 2、数值类型(12) 2.1、整数类型(6) 一张图就能解释清楚了: INTEGER同INT。 2.2、定点数(2) DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值。 使用方式如下: salary DECIMAL(5,2) 下面的介绍将基于上面这个例子。 我们看到其中有两个参数,即DECIMAL(M,D),其中M表示十进制数字总的个数,D表示小数点后面数字的位数,上例中的取值范围为-999.99~999.99。 如果存储时,整数部分超出了范围(如上面的例子中,添加数值为1000.01),MySql就会报错,不允许存这样的值。 如果存储时,小数点部分若超出范围,就分以下情况: 若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。如999.994实际被保存为999.99。 若四舍五入后,整数部分超出范围,则MySql报错,并拒绝处理。如999.995和-999

数据库-Oracle学习笔记(4)

≯℡__Kan透↙ 提交于 2020-03-02 15:07:58
Oracle字符串操作 字符串类型:char类型和varchar2类型 char类型 char类型存放的是定长字符,存不满补空格; char最大取值是2000字节,也就是最多保存2000个英文字符,1000个汉字; char可以不指定长度,默认为1,例如loc char等价于loc char(1)。 varchar2类型 varchar2类型存放的是变长字符,存多少占用多少; varchar2最大取值是4000字节,也就是最多保存4000个英文字符,2000个汉字; varchar2必须指定长度,如果loc varchar2这样写是错误的。 字符串函数 concat和 || 函数 语法1:concat(str1,str2),将两个字符串进行连接 concat(‘a’,’b’) -->’ab’ select * from emp; 查询表中所有列 select ename, sal from emp; 查询表中ename列,和sal列 select concat(ename, '的工资是:') from emp; -->SMITH的工资是: SMITH的工资是: sal ---> SMITH的工资是800 select concat(concat(ename,'的工资是:'), sal) from emp; 语法2: || 等价于concat函数,str1 || str2

sql--DQL_函数

巧了我就是萌 提交于 2020-03-02 11:38:32
一、函数的分类: 1、单行函数: 输入一行数据,每一行都会返回一个结果。 a、字符函数 :输入的是字符,返回的也是字符 常见的函数(upper 、lower、initcap首字母大写、concat、length(按字符来统计)、lengthb(按字节的方式来统计)、lengthc(按照的是unique码统计)、substr、instr、trim、ltrim、rtrim、replace b、数值函数:abs, mod, trunc, round, ceil ,floor c、日期函数 :输入的是一个日期返回的是日期或数值 sysdate , months_between (距某个日期相隔了几个月),add_months , next_day, last_day ,trunc d、转换函数 :to_char , to_number, to_date e、通用函数 :nvl , nvl2 ,nullif f、分支函数 : decode() ,case...when...then g、正则表达式函数 :regexp_substr,regexp_instr,regexp_like 2、多行函数/聚合函数/分组函数: 输入多行,返回的结果为一行 count(),sum(),avg()平均值,max(),min(),group by 分组, having 分组或筛选,rollup滚动函数

使用PyGtk Pixbuf及freetype-py 显示文本

爱⌒轻易说出口 提交于 2020-03-02 11:36:45
使用PyGtk Pixbuf及freetype-py 显示文本 计算机上显示文本的过程大体上是,先将文本转换成一个一个的bitmap,然后再用图形系统将这些bitmap显示出来。freetype是一个open source的字体引擎,它完成的工作即是将字符转换成bitmap。freetype-py是一个freetype的python绑定,为我们在Python code中使用Freetype接口提供便利。 我们可以结合PyGtk所提供的Pixbuf对象,一些操作像素的方法,PyGtk所提供的窗口管理系统,及freetype转换字符到bitmap的方法,来显示字符。这个过程的code可以像下面这样: #!/usr/bin/python ''' author: Wolf-CS website: http://my.oschina.net/wolfcs/blog last edited: May 2013 ''' import gtk, gtk.gdk import cairo import freetype import ctypes.util from ctypes import * class ColorMap: ''' A colormap is used to map scalar values to colors. It is build by adding couples

C++面试题一大波

梦想与她 提交于 2020-03-02 08:44:39
//打印1到最大的n位数。 //题目:输入数字n。按顺序打印出从1到最大的n位十进制数。比方: //输入3。则打印出1、2、3一直到最大的3位数999. //[陷阱]:这个题目非常easy想到的办法就是先求出最大的数。然后循环输出就能够了。 #include <iostream> #include <string.h> using namespace std; void Grial(char *str, char *s) { if (*s == '\0') { cout << str << endl; return; } else { for (int i = 0; i <= 9; i++) { Grial(str,s+1); *s = '1' + i; } } } void Grial(int x) { char *s = new char[x]; memset(s,'0',sizeof(s)); *(s + x) = '\0'; char *str = s; Grial(str, s); } int main() { Grial(2); return 0; } #include <iostream> using namespace std; void Grial(char *str,int n) { int count = 1; char *p = str+n; while

C语言错误: HEAP CORRUPTION DETECTED

时光怂恿深爱的人放手 提交于 2020-03-02 08:14:00
程序源代码: //写文件两种方式(文本文件和二进制文件) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //文本写文件 int writeWord(const char *path,const char *pword){ int ERRO_MSG = 0; if (path == NULL) { ERRO_MSG = 1; printf("path==NULL erro msg:%d\n", ERRO_MSG); return ERRO_MSG; } if (pword == NULL) { ERRO_MSG = 2; printf("pword==NULL erro msg:%d\n", ERRO_MSG); return ERRO_MSG; } //定义文件指针 FILE *fpw=NULL; //打开文件 fpw = fopen(path, "w");//w 打开只写文件,若文件存在,则文件长度清零,即文件内容会消失,若文件不存在则建立该文件 //判断文件是否打开成功 if (fpw==NULL) { ERRO_MSG = 1; printf("文件打开失败 fpw==NULL erro msg:%d\n", ERRO_MSG); return

模拟shell程序

我的梦境 提交于 2020-03-02 07:43:09
要求: 能识别 > , < 的输入输出重定向。 能识别出管道操作。 支持多重管道: 比如 cat | cat | cat | cat 。 支持管道和重定向的混合。 解决管道输入输出重定向和管道输出重定向和文件重定向共存的问题。 分析: 简单指令 此类指令无重定向, 无管道, 则其执行方式应该是主进程创建一个子进程, 将指令字符串组装成字符串数组后再添加调用 exec 函数即可。 带有重定向的指令 方案一 : > 和 < 直接当做命令行参数传递给 exec 函数。 经过测试, exec 并不能解析重定向符号 。 方案二 : 手动打开文件然后后 dup2 了。 带有管道的指令 将指令从管道符号拆分成多条指令, 每条指令分给一个子线程, 并让一个管道分隔的两个子进程一个获得一个管道的读端, 一个获得进程写端, 且将写端的进程的标准输出重定向到写端的文件描述符。如下图所示: 实现 /** * 完成一个模拟shell的程序。 */ # include <stdio.h> # include <stdlib.h> # include <string.h> # include <sys/types.h> # include <sys/stat.h> # include <fcntl.h> # include <unistd.h> char commands [ 1024 ] ; /*

Linux模块

二次信任 提交于 2020-03-02 04:50:53
一、为什么要使用模块 由于linux使用的是整体结构,不是模块化的结构,整体结构实现的操作系统可扩展性差。linux为了扩展系统,使用了模块的技术,模块能够从系统中动态装入和卸载,这样使得linux也具有很好的可扩展性。 二、linux中哪些代码作为模块实现,哪些直接编译进内核? 当然我们是尽量把代码编译成模块,这样就可以根据需要进行链接,内核的代码量也会少很多。几乎所有的高层组件—文件系统、设备驱动程序、可执行格式、网络层等等—都可以作为模块进行编译。 然而有些代码确必须直接编译进内核。这些代码通常是对数据结构或者函数进行修改。如内核中已经定义好了的数据结构,如果要改变这个数据结构,那么只有从新编译内核了。 三、管理模块 内核主要完成管理模块的两个任务。第一个任务是确保内核的其它部分可以访问该模块的全局符号,模块还必须知道全局符号在内核及其它模块中的地址。因此,在链接模块时,一定要解决模块间的引用关系。第二个任务是记录模块的使用情况,以便再其它模块或者内核的其它部分正在使用这个模块时,不能卸载这个模块。 四、模块使用的数据结构 每个模块都用一个module描述符描述,并且链接到一个以modules变量为链表头的双向循环链表中。 module描述符: struct module { enum module_state state; //模块内部状态 struct list_head