<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[linuxwln的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/linuxwln</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; linuxwln]]></copyright><item><title><![CDATA[log4cxx日志系统]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/89466712</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/89466712</guid><author>linuxwln</author><pubDate>Tue, 23 Apr 2019 10:01:06 +0800</pubDate><description><![CDATA[本文主要从log4cxx级别、layout、格式化、命名规则、Filter几个方面介绍。

一、log4cxx命名规则

 Logger由一个String类的名字识别，logger的名字是大小写敏感的，且名字之间具有继承的关系，子名有父名作为前缀，用点号.分隔。如：x.y是x.y.z的父亲。根logger (root logger)是所有logger的祖先，它具有如下属性：1) 它...]]></description><category></category></item><item><title><![CDATA[无边界检查函数]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/89307840</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/89307840</guid><author>linuxwln</author><pubDate>Mon, 15 Apr 2019 11:00:33 +0800</pubDate><description><![CDATA[strcpy，sprintf，strcat

对于strcpy，sprintf，strcat这些不安全的函数的讨论应该算是不少了，大家都知道可以用strncpy，snprintf和strncat来替换它们。但实际工作中似乎这些“安全版”的函数带来的疑惑还是不小，总结了一下，列在这里。

　　1.sprintf(char * str, const char * format, ...) -&gt;...]]></description><category></category></item><item><title><![CDATA[typedef和define的区别]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/82464255</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/82464255</guid><author>linuxwln</author><pubDate>Thu, 06 Sep 2018 17:02:09 +0800</pubDate><description><![CDATA[1) #define是预处理指令，在编译预处理时进行简单的替换，不作正确性检查，不关含义是否正确照样带入，只有在编译已被展开的源程序时才会发现可能的错误并报错。例如：#define PI 3.1415926
程序中的：area=PI*r*r 会替换为3.1415926*r*r
如果你把#define语句中的数字9 写成字母g 预处理也照样带入。
2）typedef是在编译时处理的。它在自己的作用域...]]></description><category></category></item><item><title><![CDATA[聊天室]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/82146921</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/82146921</guid><author>linuxwln</author><pubDate>Tue, 28 Aug 2018 14:10:26 +0800</pubDate><description><![CDATA[1、文件传输：fprintf和fwrite的区别

fprintf(fp, &quot;%d&quot;, buffer); 是将格式化的数据写入文件
fprintf(文件指针,格式字符串,输出表列);

fwrite(&amp;amp;buffer, sizeof(int), 1, fp);是以二进位方式写入文件
fwrite(数据，数据类型大小（字节数），写入数据的最大数量，文件指针);

一句话表述：fwrite是将数...]]></description><category></category></item><item><title><![CDATA[长连接&短连接以及心跳包]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81943948</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81943948</guid><author>linuxwln</author><pubDate>Wed, 22 Aug 2018 15:01:54 +0800</pubDate><description><![CDATA[一、长连接与短连接
1、长连接: 指在一个TCP连接上可以连续发送多个数据包，
        在TCP连接保持期间，如果没有数据包发送，需要双方发检测包以维持此连接;
        一般需要自己做在线维持。 
2、短连接: 指通信双方有数据交互时，就建立一个TCP连接，数据发送完成后，则断开此TCP连接;
        一般银行都使用短连接。 
        它的优点是：管理起来比较简单，...]]></description><category></category></item><item><title><![CDATA[并发服务器之多线程和多路复用(select)的区别]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81941048</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81941048</guid><author>linuxwln</author><pubDate>Wed, 22 Aug 2018 11:31:58 +0800</pubDate><description><![CDATA[一、I/O复用模型

1、IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取，它就通知该进程。IO多路复用适用如下场合：

　　（1）当客户处理多个描述字时（一般是交互式输入和网络套接口），必须使用I/O复用。

　　（2）当一个客户同时处理多个套接口时，而这种情况是可能的，但很少出现。

　　（3）如果一个TCP服务器既要处理监听套接口，又要处理已连接套接口，一般也要用到I/O复...]]></description><category></category></item><item><title><![CDATA[C++多继承模型的内存布局]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81939216</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81939216</guid><author>linuxwln</author><pubDate>Wed, 22 Aug 2018 10:19:23 +0800</pubDate><description><![CDATA[对于多继承情况

考虑示例代码


			1

			2

			3
			
			
			struct Base1 {...};

			struct Base2 {...};

			struct Derived : Base1, Base2 {...};
			
		有如下内存布局



首先出现的是派生类Derived类的虚表指针vptr

（这里插入一个提醒：

一直以来vptr都被国人...]]></description><category></category></item><item><title><![CDATA[运算符优先级口诀]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81624293</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81624293</guid><author>linuxwln</author><pubDate>Mon, 13 Aug 2018 09:32:26 +0800</pubDate><description><![CDATA[一共有十五个优先级： 

1   ()  []  .  -&amp;gt;

2   !  ~   -（负号） ++  --   &amp;amp;（取变量地址）*   （type）(强制类型)    sizeof 

3   * / %

4   + - 

5   &amp;gt;&amp;gt; &amp;lt;&amp;lt;  

6   &amp;gt; &amp;gt;= &amp;lt; &amp;lt;= 

7   == !=   

8   &amp;amp; ...]]></description><category></category></item><item><title><![CDATA[ReadDir()线程不安全函数]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81565009</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81565009</guid><author>linuxwln</author><pubDate>Fri, 10 Aug 2018 16:13:18 +0800</pubDate><description><![CDATA[一、readdir函数：      

struct dirent *readdir(DIR *dirp); 

The  data  returned by readdir() may be overwritten by subsequent calls to readdir() for the same directory stream.

成功时，readdir() 返回指向 dirent ...]]></description><category></category></item><item><title><![CDATA[linux--man 1/2/3查找的区别]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81559495</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81559495</guid><author>linuxwln</author><pubDate>Fri, 10 Aug 2018 10:52:45 +0800</pubDate><description><![CDATA[man （1） 命令

man 2 xxx用于系统调用

man 3 xxx 用于库函数

如果某个库函数没有同名的命令和系统调用，那才能直接用man xxx]]></description><category></category></item><item><title><![CDATA[0809线程]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81557787</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81557787</guid><author>linuxwln</author><pubDate>Fri, 10 Aug 2018 10:17:51 +0800</pubDate><description><![CDATA[一、线程取消

（1）int   pthread_cancel(pthread_t   thread)   
发送终止信号给thread线程，如果成功则返回0，否则为非0值。发送成功并不意味着thread会终止。   （2）pthread_setcanceltype()

函数用来设置当前线程的“可取消类型”，并且将先前的类型返回到oldtype引用中。

“可取消类型”的合法值分别是：

   ...]]></description><category></category></item><item><title><![CDATA[文件流操作：fseek()、rewind()、fprintf()、fscanf()]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81450270</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81450270</guid><author>linuxwln</author><pubDate>Mon, 06 Aug 2018 10:44:09 +0800</pubDate><description><![CDATA[1、fseek()


			int fseek(FILE * stream, long offset, int whence);
			
		函数说明：
fseek()用来移动文件流的读写位置.

1、参数stream 为已打开的文件指针,
2、参数offset 为根据参数whence 来移动读写位置的位移数。参数 whence 为下列其中一种:
    SEEK_SET 从距文件开头offse...]]></description><category></category></item><item><title><![CDATA[seekg()/seekp()与tellg()/tellp()的用法详解]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81407828</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81407828</guid><author>linuxwln</author><pubDate>Sat, 04 Aug 2018 10:08:17 +0800</pubDate><description><![CDATA[对输入流操作：seekg（）与tellg（）
对输出流操作：seekp（）与tellp（）
下面以输入流函数为例介绍用法：
seekg（）是对输入文件定位，它有两个参数：第一个参数是偏移量，第二个参数是基地址。
对于第一个参数，可以是正负数值，正的表示向后偏移，负的表示向前偏移。而第二个参数可以是：
ios：：beg：表示输入流的开始位置
ios：：cur：表示输入流的当前位置
ios：：end：...]]></description><category></category></item><item><title><![CDATA[Linux即时通信软件项目chatroom知识点整理（五）]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81326455</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81326455</guid><author>linuxwln</author><pubDate>Wed, 01 Aug 2018 11:11:28 +0800</pubDate><description><![CDATA[21、TCP是如何保证可靠数据传输的

1）应用数据被分割成TCP认为最适合发送的数据块。 这和UDP完全不同，应用程序产生的数据报长度将保持不变（将数据截断为合理的长度） 
2）超时重传：当TCP发出一个段后，它启动一个定时器，等待目的端确认收到这个报文段。如果不能及时收到一个确认，将重发这个报文段。 
3）TCP给发送的每一个包进行编号，接收方对数据包进行排序，把有序数据传送给应用层。 
4）...]]></description><category></category></item><item><title><![CDATA[Linux即时通信软件项目chatroom知识点整理（四）]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81291653</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81291653</guid><author>linuxwln</author><pubDate>Mon, 30 Jul 2018 21:15:19 +0800</pubDate><description><![CDATA[17、如何实现文件传输？如果文件过大，如何保证数据正确地传输？

（1）客户端之间传输文件

A、B两用户登录服务器成功之后，便可使用文件传输API接口传送文件，当A使用API接口：BRAC_TransFile向B发送文件时，B收到文件后，将触发B的回调函数：文件传输回调函数（参考：BRAC_SetTransFileCallBack）

内核使用UDP通道传输，不保证接收方收到的顺序与发送顺序相同...]]></description><category></category></item><item><title><![CDATA[Linux即时通信软件项目chatroom知识点整理（三）]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81274687</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81274687</guid><author>linuxwln</author><pubDate>Sun, 29 Jul 2018 20:18:38 +0800</pubDate><description><![CDATA[11、谈谈你对进程的理解?内核是如何管理进程的?

（1） 进程是多任务并发的基本概念。进程是操作系统的核心，所有基于多道程序设计的操作系统都建立在进程的概念上。

进程是操作系统的概念。是操作系统资源分配和调度的基本单位，在执行一个程序时，对于操作系统来说就是建立了一个进程。在这个过程中，伴随着资源的分配和释放。

进程是系统中正在运行的程序，是一个程序一次执行的过程，是一个动态的实体，随着系统...]]></description><category></category></item><item><title><![CDATA[Linux即时通信软件项目chatroom知识点整理（二）]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81264915</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81264915</guid><author>linuxwln</author><pubDate>Sat, 28 Jul 2018 21:31:17 +0800</pubDate><description><![CDATA[6、为什么数据库选择sqlite?还有那些嵌入式数据库?特点是什么?

(1)SQLITE功能简约，小型化，追求最大磁盘效率;只是单机上用的，数据量不是很大，需要方便移植或者需要频繁读/写磁盘文件的话，就用SQLite比较合适.

(2) 嵌入式数据库及其特点

**************************SQLite**************************

主页：http:...]]></description><category></category></item><item><title><![CDATA[Linux即时通信软件项目chatroom知识点整理（一）]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81225816</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81225816</guid><author>linuxwln</author><pubDate>Thu, 26 Jul 2018 20:15:32 +0800</pubDate><description><![CDATA[1、makefile的作用是什么？

makefile定义了一系列的规则来指定哪些文件需要先编译，哪些文件需要后编译，哪些文件需要重新编译，甚至于进行更复杂的功能操作，因为 makefile就像一个Shell脚本一样，其中也可以执行操作系统的命令。makefile带来的好处就是--“自动化编译”,一旦写好，只需要一个make命令，整个工程完全自动编译，极大的提高了软件开发的效率。

makefil...]]></description><category></category></item><item><title><![CDATA[MakeFile]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81226111</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81226111</guid><author>linuxwln</author><pubDate>Thu, 26 Jul 2018 19:44:29 +0800</pubDate><description><![CDATA[1、规则：
目标:依赖1 依赖2
命令*说明：使用命令，将依赖生成目标

注意：目标顶格写，命令前有一个TAB键，不能使用空格代替
命令执行条件：
a. “依赖”文件 比 “目标”文件 新
b. 没有“目标”这个文件

满足上述条件之一，命名就会执行

2、简单的Makefile

在源文件下新建一个Makefile文件，内容为：

test:a.c b.c a.h
gcc -o test a.c...]]></description><category></category></item><item><title><![CDATA[指针的一些复杂说明]]></title><link>https://blog.youkuaiyun.com/linuxwln/article/details/81225826</link><guid>https://blog.youkuaiyun.com/linuxwln/article/details/81225826</guid><author>linuxwln</author><pubDate>Thu, 26 Jul 2018 19:11:33 +0800</pubDate><description><![CDATA[●int p; -- 这是一个普通的整型变量
● int *p; -- 首先从p处开始，先与*结合，所以说明p是一个指针，然后再与int结合，说明指针所指向的内容的类型为int型。所以p是一一个返回整型数据的指针。
 ●int p[3] --首先从p处开始，先与结合，说明p是一一个数组，然后与int结合，说明数组里的元素是整型的，所以p是一个由整型数据组成的数组。
 ●int *p[3];...]]></description><category></category></item></channel></rss>