Linux & 计算机网络
文章平均质量分 83
学习基础的Linux知识以及常见的命令
Y-ANG
这个作者很懒,什么都没留下…
展开
-
进程间通信:消息队列&信号量&共享内存
进程间通信之管道,点击这里: http://blog.csdn.net/qq_33951180/article/details/68959819消息队列:消息队列是一种进程间发送二进制数据块的机制,每个数据块都有特定的类型,接受者进程可以有不同的类型值。信号量:共享内存:原创 2017-06-21 10:24:08 · 2278 阅读 · 0 评论 -
Shell---循环结构
Shell下的循环结构是类C的,同样也有for循环、while循环,此外,Shell也有until循环。for循环for循环的基本语法for variable in {list}do statement1 statement2 ...donefor循环的语法意思与C语言一样,即执行循环体的次数由list决定。list在这里是一个列表,可以是一系列的数字或字符串,元素之原创 2017-06-12 14:43:41 · 2527 阅读 · 0 评论 -
信号
信号的基本理解什么是信号 提到信号,大部分人的第一反应都是红绿灯,没错,这是日常生活中的一种信号,它给了人们提示,当各种颜色的灯亮起时我们应该做什么样的处理动作。不过我们今天说的信号时Linux下的信号(signal),我们回想一种场景,当我们在Linux下打开一个终端,假设现在正有一个进程在运行,它的工作就是不断循环输出“hello”,此时,当我们按下Ctrl-c时,这个进程就会被终止掉。在此原创 2017-06-07 20:09:39 · 577 阅读 · 0 评论 -
多线程实现生产者与消费者模式
生产者-消费者模式的简介:在实际的软件开发过程中,我们将产生数据的模块称为生产者,处理数据的模块成为消费者。但仅有这两者还不够成为一个生产者-消费者模式,还需要有一个缓冲区(一段内存区域)作为中介,生产者产生的数据放入缓冲区,消费者从缓冲区读取数据并处理。(注:上述所说的模块是广义的,可以是类,函数,线程,进程等)我们可以将这二者之间的关系图表示出来:总结:我们用3-2-1的方法来简单描述一个生产者原创 2017-06-01 10:08:07 · 10437 阅读 · 3 评论 -
线程的同步与互斥:条件变量&信号量
条件变量与互斥锁一样,都是一种数据变量,这两者通常搭配起来使用。条件变量的作用:实现线程的同步与互斥:接口:原创 2017-05-31 21:40:45 · 3901 阅读 · 1 评论 -
线程的同步与互斥:互斥锁
什么是线程的同步与互斥?同步:假设现有线程A和线程B,线程A需要往缓冲区写数据,线程B需要从缓冲区读数据,但他们之间存在一种制约关系,即当线程A写的时候,B不能来拿数据;B在拿数据的时候A不能往缓冲区写,也就是说,只有当A写完数据(或B取走数据),B才能来读数据(或A才能往里写数据)。这种关系就是一种线程的同步关系。互斥:对于线程A和线程B来讲,在同一时刻,只允许一个线程对临界资源进行操作,即当原创 2017-05-29 11:13:07 · 19030 阅读 · 2 评论 -
cut & sort & uniq 工具合集
cut命令主要接受三个定位方法:-b , -c , -fsort工具的常用选项:-u,-r,-o,-n,-k,-t,-funiq命令常用选项:-d,-u,-c原创 2017-05-04 13:35:26 · 1238 阅读 · 0 评论 -
awk工具
awkawk是一种文本分析工具,相对于grep的查找,sed的编辑。awk和sed都可以处理文本,awk比sed的强大之处在于处理列也是比较细致的,它可以对行(记录)、列(域)进行分析。awk默认的行分隔符是换行,列分隔符是Tab或者连续的空格(列分隔符分开的每个部分称为一个域)。awk命令行的基本形式: awk option ‘script’ file1 file2 … awk option原创 2017-05-02 09:22:50 · 1049 阅读 · 0 评论 -
sed工具
sed的基本格式: sed option ‘command’ file1 file2 … sed option -f scriptfile file1 file2 …sed的命令格式:sed /pattern/action pattern即正则表达式,action即编辑动作 sed默认是以Basic模式进行编辑的,在使用下列五个字符的特殊意原创 2017-04-28 07:45:31 · 1372 阅读 · 0 评论 -
基于HTTP协议实现的小型web服务器
我们先了解一下这个项目最终能达到的一个目标,然后以这个来进行项目的分析: 1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源 2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面) 3、服务器能进行简单的cgi运行。比如当客户在表单中输入数据后,服务器能够将运行结果返回个原创 2017-04-28 07:37:28 · 30029 阅读 · 8 评论 -
HTTP长连接和短连接
HTTP是工作在应用层的文本传输协议,它在底层的实现是基于TCP协议的,今天说的HTTP的长连接和短连接实质上是TCP的长连接和短连接。TCP的长连接和短连接:TCP的连接在客户端和服务器端之间进行数据传输时,首先需要在client和server之间建立一条通信链路,如果client和server之间不需要再传输数据或者不再需要这条链路时,就可以释放连接。原创 2017-04-04 16:54:44 · 2095 阅读 · 0 评论 -
Linux - 使用gdb调试多进程程序
gdb是Linux下一款调试器,常用来调试c/c++代码。对于多进程的程序,gdb是如何进行调试的呢?我们接下来一起学习:方法一:attach pid 利用该命令attach到子进程然后进行调试。为方便调试,可以sleep,这样有充分的时间进行调试。 方法二:gdb wrapper 专用于fork+exec模式,不用添加额外代码,但需要X环境支持(xterm/VNC)。 方法三:follow原创 2017-03-04 16:03:58 · 2064 阅读 · 0 评论 -
匿名管道和命名管道
进程间通信(IPC)每个进程有各自不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到。所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间中拷贝到缓冲区,进程2再从缓冲区把数据读走。内核提供的这种机制就是进程间通信。 通信需要媒介,两个进程间通信的媒介就是内存。通信的原理就是让两个或多个进程能够看到同一块共同的资源,这块资源一般都是由内存提供。匿名管道(原创 2017-04-03 15:02:38 · 20055 阅读 · 0 评论 -
I/O多路复用之select
I/O多路复用:I/O多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备就绪后,它就通知该进程的应用程序,应用程序就可以马上完成响应的I/O操作,而不需要等待系统完成I/O操作,这样大大提高了效率。I/O多路复用实质上是实现了单线程来处理并发请求。 系统为我们提供了多个函数来实现多路复用输入/输出模型,例如:select,poll,epoll,这里我们先讲select模型。一、select原创 2017-03-30 16:39:49 · 1275 阅读 · 0 评论 -
端口号的分类
端口:在网络技术中,端口有两层意思:一个是物理端口,即物理存在的端口,如:集线器、路由器、交换机、ADSL Modem等用于连接其他设备的端口;另一个就是逻辑端口,用于区分服务的端口,一般用于TCP/IP中的端口,其范围是0~65535,,比如用于网页浏览服务的端口是80端口,用于FTP服务的是21端口。端口号:由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,即就是端原创 2017-03-10 20:43:16 · 8346 阅读 · 1 评论 -
socket编程之实现一个简单的TCP通信
一、理解socket1、socket即为套接字,在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一的标识网络通讯中的一个进程,“IP地址+TCP或UDP端口号”就为socket。 2、在TCP协议中,建立连接的两个进程(客户端和服务器)各自有一个socket来标识,则这两个socket组成的socket pair就唯一标识一个连接。 3、socket本身就有“插座”的意思,因此用来形容原创 2017-03-29 18:33:01 · 93471 阅读 · 2 评论 -
Shell 字符串截取方法
一、运算符截取 假设现在有字符串var=http://www.mmm.cn/123.html# 和 ## 号截取字符串(删左边留右边)# :${var#*string}解释:从左边开始,删除第一个string以及左边的所有字符。var为变量名,#表示截取的运算符。## :${var##*string}解释:从左边开始,删除最后一个string原创 2017-03-29 09:20:51 · 34248 阅读 · 1 评论 -
TCP的连接建立与释放
TCP --- 传输控制协议报头格式:(1)源端口和目的端口:与UDP类似,TCP的分用是通过端口实现的。(2)序号:TCP是面向字节流的,在TCP连接中传送的字节流的每一个字节都是有顺序的,整个要传送的字节流的起始序号必须要在连接建立时设置。首部中的序号字段值表示本报文段的数据的第一个字节的序号。该字段也称为“报文段序号”。(3)确认号:是期望收到对方下一个报文段的第一个原创 2017-03-09 15:43:24 · 9176 阅读 · 0 评论 -
TCP中的四个计时器
TCP中的四个计时器包括重传计时器、坚持计时器、保活计时器、时间等待计时器重传计时器(Retransmission Timer):目的:为了控制丢失的报文段或者丢弃的报文段。这段时间为对报文段的等待确认时间。创建时间:在TCP发送报文段时,会创建对次特定报文段的重传计时器。可能发生的两种情况:在截止时间(通常为60秒)到之前,已经收到了对此特定报文段的确认,则撤销计时器;在截止时间原创 2017-03-06 12:52:28 · 13128 阅读 · 0 评论 -
Linux - 信号
一、信号的基本理解提到信号,大部分人的第一反应都是红绿灯,没错,这就是一种信号,它给了人们提示,当各种颜色的灯亮起时我们应该做什么样的处理动作。不过我们今天说的信号时Linux下的信号(signal),我们回想一种场景,当我们在Linux下打开一个终端,假设现在正有一个进程在运行,它的工作就是不断循环输出“hello”,此时,当我们按下Ctrl-c时,这个进程就会被终止掉。在此,我原创 2017-02-27 16:17:33 · 764 阅读 · 0 评论 -
可重入函数与线程安全的区别与联系
在了解可重入与线程安全之前,我们需要明确一点,可重入与线程安全是不同的概念。我们以一个例子引入可重入与不可重入:假设现在要往链表中插入一结点,而对于信号的处理也是调用insert函数,在此,insert函数被不同的执行流进入,这称为重入。但insert访问一个全局链表,有可能因为重入导致错误的结果,则insert是不可重入函数。一、可重入函数(Reentrant Function)原创 2017-02-24 12:30:29 · 1102 阅读 · 5 评论 -
Linux - 进程、线程、程序之间的区别与联系
一、进程进程是一个程序的动态运行实例一个正在执行的程序能分配处理器并由处理器执行的实体内核观点:担当分配系统资源(CPU时间,内存)的实体。进程的两个基本元素是程序代码和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行。(进程在内存中因策略或调度需求会处于各种状态)二、进程与程序的区别与联系进程是程序的一次动态运行实例,程序是可以被保存的,而进程原创 2017-02-23 11:13:37 · 2286 阅读 · 0 评论 -
Linux环境下段错误产生的原因与调试
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决。1. 段错误是什么一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内转载 2017-02-20 11:56:20 · 987 阅读 · 0 评论 -
Linux - 如何使用gcc命令生成静态库和动态库
Linux下查看是否有静态库:ar -tv test.a 一、库的简述简单的说,库(Library)是由系统提供的一组具有特定功能的函数的集合,是为提高开发效率和运行效率而设计的。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。静态库:静态是指每个用到该库的应用程序都会将该库拷贝到自己的目标代码中,因此利用静态库生成的文件比较大。这类库原创 2017-02-18 20:33:24 · 3840 阅读 · 0 评论 -
Linux - 进程管理task_struct
·进程概念简单来讲,进程是程序的一个执行实例;是一个正在执行的程序。进程与程序的关系:进程是由程序代码和代码相关联的数据集组成。进程与程序的区别:总得来说:进程是程序加载到内存后,操作系统或给该·PCB即进程控制块(Process Control Block),是进程中的一部分,它描述了进程的基本信息。·task_struct仅原创 2017-01-24 16:23:23 · 822 阅读 · 0 评论 -
如何编写一个makefile
一个工程中的源文件不计其数,按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为马克覅了就像一个Shell脚本一样其中也可以执行操作系统的的命令。makefile带来的好处就是:“自动化编译”。一旦写好,只需要一个make命令,就可以使整个工程自动编译,极大提高了软件开发的效原创 2017-01-02 11:33:11 · 5706 阅读 · 0 评论 -
Linux - sticky bit
一、粘滞位是什么?粘滞位是Linux下文件权限的一个旗标,当对一个文件设置了粘滞位后,只有owner用户或者root用户才可以对该文件进行删除或移动,但假若不对文件设置粘滞位,任何对该文件具有写和执行权限的用户都可以移动这个文件。因此,对文件设置粘滞位从一方面来将还是对文件有安全保护的。原创 2016-12-30 12:47:58 · 609 阅读 · 0 评论 -
Linux - 实现简易进度条
1.背景知识讲解2.如何实现一个简单的进度条开始今天的内容之前,我们先来回顾一个知识,看下面一段代码(Linux下运行程序)对比上边的代码,似乎相差不大,但是运行结果却千差万别:A图代码运行结果---先输出“hello”,停3秒之后程序运行完毕;B图代码运行结果---执行程序后会先停3秒,然后再输出“hello”。原创 2017-01-01 16:11:35 · 2600 阅读 · 0 评论 -
Linux - find命令讲解
windows是我们使用比较熟悉的一个系统,在windows下,文件是以后缀来区分类型的,而且我们也比较熟悉在该系统下怎样去查找一个文件。由于Linux不像windows那样,可以区分文件,并且关于Linux还有一个说法就是“一切皆文件”,在这样一个系统下工作,我们不可避免的要搜索一些指定类型的文件,那么我们怎样去查找呢?!因此这就是我们今天要解决的问题。一、Linux下的查找命令有:原创 2016-12-28 17:00:58 · 754 阅读 · 0 评论 -
Linux - atime,mtime,ctime以及用touch指令来进行修改
Linux下的文件或目录有三种时间:访问时间(Atime):每当访问这个文件/目录后,Aeecss显示的时间就会更新一次。修改时间(Mtime):当对这个文件进行修改后,Modify显示的时间就更新一次。状态改变时间(Ctime):状态改变时间是指每次用chmod命令改变文件属性后该时间就会更新一次。Linux下的命令stat可以查看这些信息,格式是stat 文件名/目录名原创 2016-12-25 11:14:00 · 5956 阅读 · 0 评论 -
哈夫曼树以及文件压缩的实现
从哈夫曼树到哈夫曼编码再到文件压缩,一步步讲解,一步步实现原创 2016-12-22 22:20:46 · 25062 阅读 · 8 评论 -
设计一个简单的对象池
在将内存池之前需要先回忆一个以前听过的东西----内存碎片。一、内存碎片是什么我们都知道当需要动态开辟内存时,系统都是在堆上开辟一块空间,尽管开辟出来内存的地址是连续的一块内存空间,但每次开辟的内存块的地址并不是连续的,这样的话当我么开辟的次数变多以后,堆上就剩余许多小块的空间导致在我们需要一块比较大的空间时会开辟失败。这是我们最常听到的一种内存碎片,也成为“外碎片”。其实还有另外一种原创 2016-12-07 19:51:23 · 1757 阅读 · 0 评论 -
c语言项目-注释转换
题目要求:要将全部的c语言风格的注释转换为c++风格的注释,如下图所示,需要将input.c文件经过注释转换程序转换为output.c文件所示分析:从input.c文件可以看书,每行开头遇见的内容有三种 // , /* ,其他代码。因此,这里就要分情况讨论。可以定义三个函数,分别处理NULL,C,C++对应状态。将 // 定义为CPP_STATE原创 2016-05-25 23:19:05 · 735 阅读 · 0 评论 -
非比较排序---计数排序&基数排序
如果给出一组数:2, 2, 9, 5, 3, 9,怎样才能遍历一次该数组就能使其有序呢?!试试之间讲的算法,好像都不行。这里我给出另一种排序算法------非比较排序!非比较排序包括计数排序和基数排序。一、计数排序算法思想:很明显,计数排序当然就需要计数啦,这里就是对这组数组中相同的数据进行计数,并以每个数据的相对位置为下标,将统计出来的次数存放在一个count[ ]数组中原创 2016-12-03 10:41:29 · 678 阅读 · 0 评论 -
排序算法---选择排序&堆排序&冒泡排序
直接选择排序、堆排序、冒泡排序及其比较直接选择排序和堆排序都属于选择排序ps:仍以升序为例!一、直接选择排序直接选择排序的思想:选择排序就是通过n-i次关键字的比较,每次从n-i+1个记录中找出最小的关键字,将其与第i个位置的数据交换。void SelectSort(int* a, size_t size){ assert(a); int max = 0; for (size_t i=原创 2016-12-01 14:42:16 · 1345 阅读 · 0 评论 -
排序算法---直接插入排序和希尔排序
排序算法大致可分为:1.插入排序 --- 直接插入排序、希尔排序2.选择排序 --- 选择排序、堆排序3.交换排序 --- 冒泡排序、快速排序4.归并排序本篇博客主要介绍插入排序。。ps:以下两种排序算法都是以升序为例讲解!一、直接插入排序直接插入排序的思想:假设数组第一个数是有序的,从第二个数开始遍历,每拿出一个数就和前面的有序的数比较,如果比它小,就原创 2016-11-26 13:00:42 · 1077 阅读 · 0 评论 -
排序算法---归并排序
一、归并排序的思想:1.每次将一组数分为两组,直到不能再分为止;2.从个数最小的数组开始比较,每次将比较大(或小)的数放入辅助数组中,辅助数组的下标+1,如此循环,直到有一个数组比较完,此时如果另外一个数组有剩余,就将剩余的这些数字全部按顺序加入辅助数组中。从最小的数组向上一步步累加,如果每次小的数组有序,那么合并以后的数组就有序。(下面这幅图给出的是一种分割两个数组的方法,分的时候最好从原创 2016-11-23 21:59:12 · 441 阅读 · 0 评论 -
BTree
B树是一种多叉的平衡搜索树,适合外查找。一棵M叉(M>2)的B树,可以是一棵空树,也可以是具有如下的性质的B树:(M为)1.根节点至少有两个孩子2.每个非根结点有[M/2,M]个孩子3.每个非根结点有[M/2-1,M-1]个关键字,并且是以升序排列4.key[i]与key[i+1]之间的孩子结点的值介于key[i]与key[i+1]之间5.所有叶子节点在同一层以这组数据原创 2016-11-19 12:39:40 · 646 阅读 · 0 评论 -
哈希表---开链法解决哈希冲突
上篇文章已经写过构造哈希表时用开放定址法解决哈希冲突,这次我就来写写这个开链法解决哈希冲突的问题!一、结点定义我们已经知道开链法大概是一种什么结构了,(如果不知道,这里有讲哦点我点我)显而易见,实现哈希桶的话我们就必须多一个指针next,至少这样才看起来有个链表的样子嘛!![cpp] view plain copy//开链法(原创 2016-11-19 10:17:17 · 7535 阅读 · 0 评论 -
哈希表
哈希表,又称为散列表,它是根据关键码(key)直接访问在内存中的存储的一种数据结构。它通过把关键码根据某一函数进行转换后映射到表中的,这个函数称为散列函数,存放记录的数组称为散列表。一、哈希表的构造如何构造一个散列表?!请看这篇博客^-^:散列表的构造和哈西冲突值得一提的是,构造这个表时,我们需要考虑这个位置的状态,是EMPTY,EXIST 还是DELETE?!当表中还没有原创 2016-11-19 10:19:07 · 483 阅读 · 0 评论