- 博客(109)
- 收藏
- 关注
原创 Shell常用命令
1、 ls: 类似于dos下的dir命令ls最常用的参数有三个: -a -l -F。ls –aLinux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示一般文件名外,连隐藏文件也会显示出来。ls –l该参数显示更详细的文件信息。ls –F使用这个参数表示在文件的后面多添加表示文件类型的符号,例如*表示可执行,/表示目录,@
2017-01-13 15:31:05
358
原创 Linux三大共享文件的方法
1. Samba Samba 用于Linux 和windows之间的共享,ubuntu里面默认没有安装samba 在安装好samba之后,就用开始配置samba服务: Samba服务器主要配置文件为/etc/samba/smb.conf,并且可以将NetBIOS名与主机的对应关系写在/etc/samba /lmhosts文件中。 在Windo
2017-01-12 13:45:31
611
原创 网络编程的一般步骤
对于TCP连接:1.服务器端1)创建套接字create;2)绑定端口号bind;3)监听连接listen;4)接受连接请求accept,并返回新的套接字;5)用新返回的套接字recv/send;6)关闭套接字。2.客户端1)创建套接字create; 2)发起建立连接请求connect; 3)发送/接收数据send/recv;4)关闭套接字。TCP总结:Server端
2017-01-11 16:45:22
629
原创 Linux网络编程之SOCKET文件传输
[html] view plain copy #includenetinet/in.h> // sockaddr_in #includesys/types.h> // socket #includesys/socket.h> // socket #includestdio.h> // printf #includestdlib
2017-01-10 20:37:56
639
原创 理解 Linux 条件变量
1 简介当多个线程之间因为存在某种依赖关系,导致只有当某个条件存在时,才可以执行某个线程,此时条件变量(pthread_cond_t)可以派上用场。比如: 例1: 当系统不忙(这是一个条件)时,执行扫描文件状态的线程。 例2: 多个线程组成线程池,只有当任务队列中存在任务时,才用其中一个线程去执行这个任务。为避免惊群(thrundering herd),可以采用
2017-01-09 22:19:18
290
原创 C linux 信号量
#include信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为:int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共
2017-01-08 22:40:15
241
原创 C语言register关键字
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。一、皇帝身边的小太监----寄存器 不知道什么是寄存器?那见过太监没有?没有?其实
2017-01-07 22:08:52
284
原创 typedef和#define的用法与区别
typedef和#define的用法与区别一、typedef的用法在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:typedef int INT;typedef int ARRAY[10];typedef (int*) pINT;typedef可
2017-01-06 10:21:39
189
原创 一个单链表,不知道长度,写一个函数快速找到中间节点的位置
List *list_middle(List *l) { List *fast; List *slow; fast = slow = l; while (fast != NULL) { if (fast->next) fast = fast->next->next;
2017-01-05 16:16:42
1015
原创 二分法查找
二分法查找:a是查找的数组,二分法查找的前提条件是a数据的排序是有序的。key是待查找的变量,n是数组a的长度。int binary( int *a, int key, int n ){ int left = 0, right = n - 1, mid = 0; mid = ( left + right ) / 2; while( left
2017-01-04 11:04:06
325
原创 互斥锁mutex
在信号量最后的部分说,当count=1的时候可以用信号量实现互斥。在早期的Linux版本中就是当count=1来实现mutex的。 内核重新定义了一个新的数据结构 struct mutex, 将其称为互斥锁或者互斥体。同时对信号量的DOWN和UP操作针对struct mutex做了修改。互斥锁的定义和初始化因为struct mutex的定义中有一些调试相关的成员,在这里
2017-01-03 22:28:56
344
原创 Linux系统函数write()函数
1.Write函数 用法: #include ssize_t write(int fd, const void *buf, size_t count);参数: fd:要进行写操作的文件描述词。buf:需要输出的缓冲区count:最大输出字节计数使用时候偶然发现,如果设置打开fb=open("/dev/fb0",O_RDONL
2017-01-02 19:40:00
2785
原创 C++的类与对象
C++ 类 & 对象C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类被称为类的成员。C++ 类定义定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它
2017-01-01 21:38:59
249
原创 sqlite3数据库详细使用方法
sqlite3_open()sqlite3_prepare()sqlite3_step()sqlite3_column()sqlite3_finalize()sqlite3_close()这几个过程是概念上的说法,而不完全是程序运行的过程,如sqlite3_column()表示的是对查询获得一行里面的数据的列的各个操作统称,实际上在sqlite中并不
2016-12-31 15:40:46
10853
4
原创 setsockopt()用法
int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen);s(套接字): 指向一个打开的套接口描述字level:(级别): 指定选项代码的类型。SOL_SOCKET: 基本套接口IPPROTO_IP: IPv4套接口IPPROTO_IPV6: IPv6套接
2016-12-30 16:07:40
698
原创 判断单链表是否有环
判断单链表是否有环假设两个指针分别为p1和p2,每循环一次只向前走一步,p2向前走两步,知道p2碰到NULL指针或者两个指针相等则说明有环如果存在,start存放在圆环开始的节点bool IsLoop(node *head,node *start){node *p1=head,*p2=head;if(head==NULL||head->next==NULL);//head为
2016-12-29 20:31:22
222
原创 位运算的应用
位操作运算符的应用& 1.对特定位清0 mask中的特定位为0,其余位为1。s = s & mask;2.取某数中的指定位 mask特定位置1,其余位0。| 常用来将源操作数某些位置1,其余位不变 mask特定位置为1,其余位为0。^ 1.使特定位取反 mask特定位置1,其余位为0; 2.不引用第三方变量,交换值a = a ^
2016-12-28 19:21:08
215
原创 关于子进程和父进程--fork函数转
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来
2016-12-26 19:35:07
330
原创 带头节点单链表逆序
#include#includetypedef struct node{int num;struct node *next;}Node;typedef Node * Link;void revers_list(Link head){Link p1 = NULL;Link p2 = NULL;Link p3 = NULL;
2016-12-24 22:16:37
367
原创 socket通信相关
在系统开发过程中,如果涉及到了Socket通讯,那就要制定好通讯的协议,只有制定好了规则,后面的工作才方便顺利展开,制作通讯协议时要考虑到通讯的安全性,必要的信息要经过加密处理,同时也要考虑到系统的可扩展性,如果以后需要增加一个命令或者修改命令要保证这些工作能方便的进行。 协议的内容包括如下:1. 本协议使用的字符串,如密码,位数为6位。2. 通讯方式
2016-12-23 21:02:24
221
原创 树有关概念
一、什么是树? 在前几篇的博文中主要讲述的是链式存储这种数据结构,它们的用途非常广泛,但是在实际的应用中,还存在着另一种非常重要的数据结构,它就是树。树的结构示意图如下所示: 上图就是一种数据结构----树,之所以在每个框中都留出空白,主要原因是这种结构如果根据上下文是能够传达一些重要的结构信息,比如我们可以作如下思考:
2016-12-22 21:38:32
196
原创 const define static extern 关键词详解
constconst关键词并不能把一个变量变成一个常量, 在符号前加上const表示这个符号不能被赋值, 即他的值对这个符号来说是只读的, 但并不代表这个值不能用其他方法去改变. 通过下面的例子就能比较好理解,int i = 5;const int *a = &i;*a = 8; //报错, 只读不能赋值i = 10; //ok平常我们见得多的con
2016-12-21 18:50:55
200
原创 简述strcpy,sprintf,memcpy的区别
三者主要有以下不同之处: (1)操作对象不同,strcpy的两个操作对象均为字符串,sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。 (2)执行效率不同,memcpy最高,strcpy次之,sprintf的效率最低。 (3)实现功能不同,strcpy主要实现字符串变量间的拷贝,sprin
2016-12-20 20:27:31
557
原创 链表和数组的区别
从逻辑结构来看1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素从内存存储来看
2016-12-19 19:45:16
142
原创 exit()和_exit()的区别
进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢。1.linux中的进程退出进程退出表示进程即将结束。在Linux中进程退出分为了正常退出和异常退出两种。(1)正常退出a. 在main()函数中执行return;b.调用exit()函数;c.调用_exit()函数。(2)异常退出a.调用a
2016-12-18 21:38:03
157
原创 什么是死锁,以及如何预防
所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。虽然进程在运行过程中,可能发生死锁,但死锁的发生也
2016-12-17 19:16:27
224
原创 静态库和动态库区别
我们通常把一些公用函数制作成函数库,供其它程序使用。 函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。 本文主要通过举例来说明在Linux中如何创建静态库和动态
2016-12-16 20:18:14
221
原创 strlen 与sizeof()的区别
strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。 char aa[10];cout char aa[10]={'\0'}; cout char aa[10]="jun"; cout 而sizeof()返回的是变量声明
2016-12-15 12:18:54
131
原创 堆和栈的区别
主要的区别由以下几点: 1、管理方式不同; 2、空间大小不同; 3、能否产生碎片不同; 4、生长方向不同; 5、分配方式不同; 6、分配效率不同; 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。 空间大小:一般来讲在32位系统下,堆内存可以
2016-12-14 10:06:57
131
原创 线程与进程的区别与联系
线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源(3)线程是处理器调度的基本单位,但进程不是.4)二者均可并发执行.进程和线程都是由操作系统所体会的程序运行的基本单元
2016-12-13 16:54:23
147
原创 socket通信
端口 网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。 按照OSI七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。 从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。 端口是一种抽象的
2016-12-12 19:26:42
202
原创 server多路复用
#include #include #include #include #include #include #include #include#include#include/* 宏定义端口号 */#define portnumber 8000#define MAX_LINE 80/*处理函数 将大写字符转换为小写字符 参数为需要
2016-12-10 21:14:08
174
原创 tcp三次握手
TCP(Transmission Control Protocol) 传输控制协议TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urge
2016-12-09 15:12:49
135
原创 udp与tcp区别
理解:窗口和滑动窗口TCP的流量控制TCP使用窗口机制进行流量控制什么是窗口?连接建立时,各端分配一块缓冲区用来存储接收的数据,并将缓冲区的尺寸发送给另一端接收方发送的确认信息中包含了自己剩余的缓冲区尺寸2. TCP的流控过程(滑动窗口)2. TCP 与UDP的区别 很多文章都说TCP协议可靠,UDP协议不可靠!为什么前者可靠,后者不可靠呢?既然UDP协议不可靠,为
2016-12-08 14:07:57
172
原创 tcp线程实现
#include #include #include #include #include #include #include #include #define portnumber 3333void * read_msg(void *arg){ int fd = *((int *)arg);int nread = 0;cha
2016-12-07 18:53:44
227
原创 tcp进程实现
#include #include #include #include #include #include #include #include #define MY_PORT 3333int main(int argc ,char **argv){int listen_fd,accept_fd;struct socka
2016-12-06 22:14:43
219
原创 TCP协议的网络编程
#include #include #include #include #include #include int main(){int listenfd,connfd;int n;int i;struct sockaddr_in servaddr,cliaddr;socklen_t clilen;char mesg[1000];
2016-12-05 20:06:06
172
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人