自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Sunnylunch-blog

介绍c/c++基础知识,介绍一些项目。

  • 博客(283)
  • 资源 (1)
  • 收藏
  • 关注

原创 shell脚本执行过程

一、先看一个简单的脚本执行过程 shell脚本中以#表示注释。但是如果#位于第一行并且后面是感叹号,它表示该脚本使用后面指定的解释器解释执行。#!/bin/bash叫做shebang,它指定了解释器。 因为编写好的shell脚本文件是一个普通文本文件,所以我们要对它赋予可执行权限才可以执行。或者直接使用解释器对文本文件进行解释执行。 二、shell的执行过程 1、

2017-03-24 10:14:18 10101

原创 shell编程之符号与变量

一、shell特殊字符 1、一般通配符 2、模式表达式 3、引号 在shell中引号分为三种,单引号、双引号和倒引号。 3.1、双引号 由双引号括起来的字符(除$,倒引号(),和反斜杠(\)外),其余字符均视为普通字符。对这三种字符仍然保持特殊功能。$表示变量替换,倒引号()表示命令替换,反斜杠表示转移字符。 例:i=10; echo “i”输出:103.2、单引号由单引号括起来

2017-03-23 20:47:46 1324

原创 shell中的命令替换

在shell里面有倒引号”“”和$()两种命令替换方式: 如: 那么这两条命令有什么不同呢? 在多层次的复合替换命令中,倒引号需要加”\”转义,$()则不需要。 例:conmand1 conmand2conmand3。 原意是先执行conmand3,将结果交给conmand2处理,最后再将conmand2的结果交给conmannd1处理。 但实际由于两个倒引号进行了嵌套,最终将conma

2017-03-23 18:55:19 1177

原创 linux命令之eval

1、linux的eval命令用于重新运算求出参数的内容。 语法:eval cmdline 功能:eval会对后面的cmdline扫描两遍,第一遍扫描之后如果cmdline是个普通命令的话,则执行此命令。如果cmdline中含有变量的间接引用,用变量的值代替变量。 例1:变量i的值是”>”,用i进行重定向的话,结果如下: 可见,eval将间接引用解释成变量的值。 例2:使用eval可以创

2017-03-23 13:14:54 628

原创 linux下各目录含义

1、/ 根目录,系统中所有目录均是从根目录开始的。 2、/bin:bin是binary的缩写,该目录存放了使用则最常用的命令。 3、/boot:引导核心的程序目录,主要存放Linux Loader(Linux装配程序)LILO使用的各种文件。 4、/dev:dev是device(设备)的缩写,这个目录包含了Linux所有的外部设备名。 5、/etc:etc是etcetera(其他事项)的缩写

2017-03-23 13:11:53 946

原创 三种I/O复用方式的比较

select、poll、epoll这三组I/O复用系统调用都能同时监听多个文件描述符,他们都通过timeout参数指定要等待的时间。直到事件就绪时返回,返回值就是就绪的文件描述符的数量。下面我们从事件集、最大支持文件描述符数量,工作模式和具体实现方面比较一下他们的异同:1、事件集 select的参数没有将文件描述符和事件绑定,他仅仅是一个文件描述符的集合,所以select需要分别用三个参数

2017-03-21 12:09:23 1252

原创 I/O多路转接之epoll

一、epoll函数 epoll是linux特有的I/O复用函数,它比select和poll要高效的多。epoll用一个事件表来保存用户关心的文件描述符,但是这个事件表需要一个文件描述符来标识。1、内核事件表#include<sys/epoll.h>int epoll_create(int size);功能:创建一个事件表,并返回这个事件表的文件描述符。这个文件描述符就代表一个epoll模

2017-03-20 23:09:40 889

原创 I/O多路转接之poll

poll也是一种I/O多路转接的方式,select将三种事件进行了区分,并且用三个位图来表示不同的监测事件。而poll统一用一种结构来管理要监测的事件。#include<poll.h>int poll(struct pollfd* fds,nfds_t nfds,int timeout);参数: fds: 它是一个结构体数组,其中元素的类型如下: struct pollfd{ int fd

2017-03-17 11:04:16 810

原创 I/O多路复用之select简介

系统提供select函数用来实现I/O多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件描述状态变化的。程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生状态变化。通常I/O操作有两个步骤,一个是等,另一个是数据搬迁。select主要是在等的这个状态阻塞着直到事件发生。头文件:#include<sys/select.h>#include<sys/type

2017-03-15 22:54:02 937

原创 netstat命令

1、netstat是什么? netstat是在内核中访问网络相关信息的程序,它能够提供TCP连接、TCP和UDP监听、进程内存管理的状态。netstat也是一种控制台命令,是一个监控TCP/IP网络的非常有用的工具,他可以显示路由表、实际网络连接以及每一个网络接口设备的状态信息。使用netstat可以让用户知道有哪些网络连接正在运作,使用时如果不带参数,netstat显示活动的TCP连接。

2017-03-10 15:57:47 1067

原创 端口号的分类

1、什么是端口号 在一台主机上运行了多个服务,主机为了区分这些服务,所以给每个服务都分配一个端口号,端口号唯一的标识这台主机上的某个服务。 IP地址唯一标识网络上的一台主机,服务器用通过端口号来区分不同的网络服务。所以IP地址+端口号就表示网络中唯一的一个服务。 客户端通常对它所使用的端口号并不关心,只要保证该端口在本主机上是唯一的就可以了。所以客户端端口号又叫做临时端口号,

2017-03-10 15:51:31 2336

原创 tcpdump工具

一、什么是tcpdump wireshark是windows下面的抓包工具,tcpdump是linux下的抓包工具。tcpdump可以将网络中传送的数据包完全截获下来提供分析。它支持对网络层、协议层、主机、网络或端口的过滤、并提供and、or、not等逻辑帮你去掉无用的信息。二、tcpdump的使用 tcpdump的参数主要是用来过滤的,因为网络中流量很大,如果不加分辨将所有数据包都截留

2017-03-10 15:45:27 1453

原创 bind为什么会出现地址重用

1、在客户端服务器模式中,如果服务器退出,然后立即重新启动的话,然后就出现”试图绑定一个已经在使用的端口”的错误,要等过一段时间之后才可以bind,这是为什么呢??? 或许你感到非常迷惑,明明服务器的套接字已经被关闭了,但为什么仍然禁止绑定端口。这是由于套接字处于TIME_WAIT状态引起的,这个状态会持续2MSL时间。在TIME_WAIT退出后,套接字被删除,该地址才能被重新绑定而不出现

2017-03-10 15:40:44 1938

原创 为什么不建议客户端bind

1、为什么不建议对客户端进行bind? 首先要明确,客户端不是不能bind,他也可以bind,但是我们却不建议对客户端bind。 回想一下,服务器为什么要bind呢?因为服务器总是被动方,需要在一个众所周知的端口上等待连接请求,而且作为服务器它的端口号应该是固定的。服务器bind一个端口就表示会在这个端口提供一些特殊的服务。 而客户端它是主动发起方,我们并不关心是客户端

2017-03-10 15:36:37 4036

原创 TCP的可靠性体现在哪里

TCP提供一种面向连接的、可靠的字节流服务。我们都知道两个使用TCP的应用,必须先建立TCP连接才能进行数据通信。那么TCP都有哪些机制来确保可靠性呢??? 1、超时重传 发送一个报文段,会立即启动一个重传计时器,等待目的端口确认收到这个数据段。否则将超时重传。2、确认响应 对于一个收到的请求,将发送一个确认。这个确认通常要延迟几分之一秒。3、首部校验 TCP数据报文段中有收和数据的校验和。

2017-03-10 15:35:02 2655

原创 URG和PSH的区别

URG(紧急位):当URG=1的时候,紧急指针有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是从发送端向另一发送发送紧急数据的方式。数据从第一个字节到紧急指针所指字节就是紧急数据。数据段中的紧急数据不进入缓冲区就直接交给上层进程,而余下数据则要进入接收缓冲区。PSH(急迫位):PSH=1时,客户端发送给服务器的报文段立即被服务器TCP交付给应用进

2017-03-06 21:52:58 1351

原创 数据结构知识框图

数据结构知识框图:

2017-03-06 17:26:13 3263 4

原创 TCP连接和释放

一、TCP连接过程 1、TCP连接状态图 TCP的三次连接中,客户端是主动链接,服务器是被动连接,整个过程有三次数据报文段的传送,所以TCP建立过程又称为三次握手。 服务器进程先创建传输控制块TCB,准备接受接受客户进程的连接请求,然后服务器进程就处于LISTEN(收听)状态,等待客户端的连接请求。传输控制块TCB里面存储了每一个连接中的一些重要信息,比如:TCP连接表、到发送和接受缓

2017-03-05 22:03:03 3824 2

原创 距离向量算法

路由: 1、数据包从源地址到目的地址所经过的路径,由一系列路由结点组成。 2、某个路由结点为数据报选择投递方向的选路过程。路由结点: 一个具有路由能力的主机或路由器,它维护一张路由表,通过查询路由表来决定向哪个接口接口发送数据包。接口:路由结点与某个网络相连的网卡接口。路由表:由很多路由条目组成,每个条目都指明去往某个网络的数据包应该经由哪个接口发送,其中最后一条是缺省路由条目。路由条目:路由

2017-03-05 16:05:44 18022 1

原创 ARP地址解析协议

ARP:地址解析协议,用来将IP地址转化成MAC地址的。 在网络通信中,数据包首先被网卡接受到再去处理 上层协议,如果接受到的数据包的硬件地址与本机不符,则直接丢弃。所以当数据报到达目标网段后,需要知道目的主机的MAC地址才能通信。 到达目的网段后,源主机发出ARP请求,询问目的主机的MAC地址是多少,并将这个请求广播到本网段,目的主机以太网地址填写FF:FF:FF:FF:FF:

2017-03-05 16:02:34 1330

原创 TCP第四次挥手为什么要等待2MSL

当客户端进入TIME-WAIT状态的时候(也就是第四次挥手的时候),必须经过时间计数器设置的时间2MSL(最长报文段寿命)后,才能进入关闭状态,这时为什么呢??? 这最主要是因为两个理由:1、为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端

2017-03-05 15:58:52 10720

原创 TCP使用的四种计时器

TCP使用的四种计时器: 1、重传计时器 当TCP发送报文段时,就创建该特定报文段的重传计时器。 1.1、若在计时器截止时间到(通常60秒)之前收到了对此特定报文段的确认,则撤销此计时器。 1.2、若在计时器截止时间之前没有收到对此特定报文的确认,则就认为该报文丢失,需要重传此报文段,并将计时器复位。2、坚持计时器 假设TCP收到了一个窗口大小为0报文段,发送TCP就停止传送报文段

2017-03-05 15:53:11 3744 1

原创 LZ77压缩

在huffman压缩中,对于字符不再使用定长编码。我们利用字符出现的次数之间的差异,对字符重新进行编码,使得出现次数多的字符编码短,而出现次数少的字符编码长,这样的话整体来说,需要的总的bit位数就会下降,以此来达到压缩的目的。可见,在这种情况下,如果字符出现的次数大致都相等的话,就起不到压缩的效果了,这也就是huffman为什么不能进行二次压缩的原因,因为压缩一次之后,会使得所有字符出现的次数相差

2017-03-04 20:27:08 5172

原创 GDB多进程调试

多进程调试命令: 1、默认设置下,在调试多进程程序时GDB只会调试主进程。但是设置follow-fork-mode的话,就可调试多个进程。 set follow-fork-mode parent|child: 进入gdb后默认调试的是parent,要想调试child的话,需要设置set follow-fork-mode child,然后进入调试。当然这种方式只能同时调试一个进程。 show

2017-03-03 10:57:41 3421

原创 GDB多线程调试

多线程调试基本命令: info threads:显示当前可调试的所有线程,GDB会给每一个线程都分配一个ID。前面有*的线程是当前正在调试的线程。thread ID:切换当前调试的线程为指定ID的线程。thread apply all command:让所有被调试的线程都执行command命令。thread apply ID1 ID2 … command:让线程编号是ID1,ID2…等等的线程都执

2017-03-02 23:00:28 4856

原创 CRC校验算法

CRC(Cyclic Redundancy Check):循环冗余检验。在链路层被广泛使用的检错技术。 CRC原理: 1、发送端 1.1、在发送端先将数据分组,每组k个数据。假定要传送的数据是M。 1.2、在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位。 虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值

2017-02-27 21:43:10 4722

原创 终端、守护进程、作业

一、进程组,作业,会话 1、进程组 每个进程除了有一个进程ID之外,还属于一个进程组。进程组是多个进程的集合,同一个进程组的进程的组ID相同,每一个进程组都有一个唯一的组ID。 每个进程组都有一个组长,组长的pid与gid相同。组长可以创建一个进程组,创建该组中的进程,然后终止。只要进程组内任意一个进程存在,那么这个进程组就存在,与组长进程是否终止无关。 通常进程组都

2017-02-26 23:27:02 844

原创 crond定时任务

1、什么是crond??? crond是linux用来定期执行命令或指定程序任务的一种服务。安装完操作系统后,默认会启动crond任务调度服务。crond服务会定期检查系统中是否有要执行的任务。如果有要执行的任务便会自动执行该任务。crond定时任务服务就像我们早上使用的闹钟一样 查看crond服务状态: 命令:service crond status 启动crond服务: 命令:serv

2017-02-26 08:42:37 1335 1

原创 创建守护进程fork一次与fork两次的区别

1、守护进程的特点 1.1、独立于控制终端。 1.2、父进程是1号进程(init),所以守护进程也是孤儿进程 1.3、守护进程是独自成组进程的。 1.4、守护进程独自成一个成为会话的会话首进程,或者是一个会话中的某个进程组。 1.5、守护进程的运行不受用户登录和注销的影响。2、为什么要有守护进程??? 控制终端因为某些原因会发送一些信号,接受到信号的进程去执行这些信号的默认处理动作会导致

2017-02-26 08:38:30 1990 7

原创 线程安全与可重入

1、什么是线程安全 当一个函数被多个线程反复调用的时候,他会一直产生正确的结果,那么这个函数就是线程安全的。线程安全函数解决了多个线程调用函数时访问临界资源的冲突问题。2、可重入 在多线程或有异常控制流的情况下,当某个函数原型到中途时,控制流有可能被打断去执行另一个函数,而这”另一个函数”有可能是他本身,如果在这种情况下不会出现问题,比如与说数据或状态不被破坏,而且

2017-02-24 22:29:07 958 3

原创 线程间同步与互斥

一、同步与互斥概念 进程/线程之间的关系主要有两种,同步与互斥。 互斥: 互斥就是指某一资源同时只能允许一个访问者对其进行访问,具有唯一性和排他性,但是互斥无法限制访问者对资源的访问顺序,即访问时无序的。 对于线程来说,互斥就是说两个线程之间不可以同时运行,他们之间会相互排斥,必须等一个线程运行完毕之后,另一个才能运行。 同步: 同步是指在互斥的基础上(大多数情况

2017-02-22 11:47:39 1400

原创 生产者消费者模型

一、什么是生产者消费者模型 在实际的开发中,经常会碰到如下场景:某个模块负责生产数据,这些数据由另一个模块来负责处理。产生数据的模块就形象的称为生产者,而处理数据的模块就称为消费者。只有生产者和消费者还不够,这个模型还必须要有一个缓冲区处于生产者和消费者之间,作为中介。生产者把数据放入缓冲区,而消费者从缓冲区中取出数据。 二、为什么要使用生产者消费者模型 1、解耦 假设生产者和消费者

2017-02-20 23:33:26 1996 6

原创 多线程编程

一、什么是线程??? 线程是在进程内部运行的控制流程。多线程的控制流程可以长期共存,操作系统会在各线程之间调度和切换,就像在多个进程之间调度和切换一样。 由于同一个进程的多个线程共享同一地址空间地址空间,因此代码段和数据段都是共享的,如果定义一个函数,在各线程之中都可以调用,如果定义一个全局变量,在各线程中都可以访问到的,除此之外,线程还共享以下资源: 1、文件描述符表 2、

2017-02-19 21:48:04 689

原创 静态库与动态库

一、什么是静态库、动态库??? 静态库:这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。 动态库:这类库的名字一般是libxxx.M

2017-02-18 00:49:24 882

原创 gcc常用命令选项

gcc这条命令用来将源代码生成可执行程序,下面来看一下gcc的常用选项。 1、无选项编译链接 例:命令:gcc test.c //会默认生成a.out可执行程序 2、-E: 进行预处理和编译,生成汇编文件。 命令:gcc -E test.c //会生成test.i文件3、-S: 进行预处理,编译,汇编等步骤,生成”.s”文件 例:命令:gcc -S test.c

2017-02-17 21:59:42 1424

原创 IPC之共享内存

一、共享内存的原理 二、共享内存的函数 2.1、int shmget(key_t key,size_t size,int flags); 返回值:失败返回-1,成功返回共享内存的id。 size:表示要申请的共享内存的大小,一般是4k的整数倍。 flags:IPC_CREAT和IPC_EXCL一起使用,则创建一个新的关系内存,否则返回-1。IPC_CREAT单独使用时返回一个共享

2017-02-17 15:32:32 874

原创 linux下的信号量

一、什么是信号量??? 信号量的本质是一种数据操作锁、用来负责数据操作过程中的互斥、同步等功能。 信号量用来管理临界资源的。它本身只是一种外部资源的标识、不具有数据交换功能,而是通过控制其他的通信资源实现进程间通信。 可以这样理解,信号量就相当于是一个计数器。当有进程对它所管理的资源进行请求时,进程先要读取信号量的值,大于0,资源可以请求,等于0,资源不可以用,这时进程

2017-02-16 20:44:33 1738 1

原创 实现简单的shell

用讲过的各种C函数实现一个简单的交互式Shell,要求:给出提示符,让用户输入一行命令,识别程序名和参数并调用适当的exec函数执行程序,待执行完成后再次给出提示符。实现过程中用到的函数: 代码:#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<stdlib.h>#include<wait.h>#includ

2017-02-14 16:00:26 1531

原创 C++实现五子棋游戏

三子棋、五子棋之类的游戏,非常简单,对于初学者来说是一个不错的练手的小项目,以前用C语言写过三子棋游戏。最近在看C++,所以就想到在三子棋的基础上利用C++语言实现五子棋游戏。主要功能: 有3个模式:0表示退出、1表示电脑vs玩家、2表示玩家vs玩家。 当一局完成之后选择’y’则又会进入选择模式。 源代码(VS2013编译器下写的):#include<iostream>#include<st

2017-01-23 11:45:14 32942 9

原创 文件描述符

一、什么是文件描述符? 在linux下一切皆文件,文件描述符是内核为了高效的管理已经被打开的文件所创建的索引,它是一个非负整数,用于指代被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符完成的。 在linux中,进程是通过文件描述符(file descriptors 简称fd)来访问文件的,文件描述符实际上是一个整数。在程序刚启动的时候,默认有三个文件描述符,分别是:0

2017-01-18 22:42:18 2780

C&&C++知识体系结构图

C,C++知识体系结构图

2016-09-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除