自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 子进程的异步等待方式

通过wait函数或者waitpid函数可以清理僵尸进程,父进程可以通过两种方式等待子进程,一种是阻塞方式,另一种是非阻塞方式,而不管是那种方式,父进程都做不到完全不理会子进程而去完成自己的动作,即子进程不能达到异步等待的目的。1、关于SIGCHLD信号子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程就

2017-07-15 10:12:47 367

原创 模拟实现sleep函数

模拟实现sleep,介绍三个函数alarm函数,sigaction函数,以及pause函数。alarm函数:       #include        unsigned int alarm(unsigned int seconds);调用alarm函数可以设定一个闹钟,告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程。这个函数的返

2017-07-14 11:07:42 482

原创 TCP的握手与挥手

TCP的通讯时序图建立连接时为什么需要“三次握手”?如果服务端发送的连接数据包丢失,客户端长时间接收不到服务端的信号,他就可能会认为自己发送的连接数据未成功发送给服务端,所以他就会一直向服务端发送连接信号,导致服务端缓冲区里充斥着大量客户端发送的连接请求信号,浪费资源。 “三次握手主要是防止已失效的连接请求报文段又传送到服务端,因此产生错误”。当“client发出的第一个连

2017-07-14 10:53:18 258

原创 端口分类调研

什么是端口       在 Internet上,各主机间通过TCP/UDP协议发送和接收数据报,各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择。但是大多数操作系统都支持多程序(进程)同时运行,端口号就保证了目的主机将数据传送给指定的进程。      本地操作系统会给那些有需求的进程分配协议端口 (protocal port,即我们常说的端口),每个协议端口由一个正整数

2017-07-14 10:47:47 260

原创 代理服务器与NAT技术

代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须送出Request信号来得到回答,然后对方再把信息以bit方式传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,

2017-07-14 10:43:53 307

原创 Linux实现UDP连接

udp是无连接不可靠的IP协议,和tcp有所不同。 udp服务器调用socket(),bind(),listen()完成套接字初始化后,调用accept()阻塞等待处于监听端口的状态。 udp客户端调用socket()初始化后,调用connect()发送SYN字段并阻塞等待应答。 客户端如果一直与服务端连接,服务端退出后重启时,端口号已被占用,和tcp一直,具有TIME_WAIT特性。

2017-07-14 10:31:45 3280

原创 Linux实现TCP连接

TCP连接可以分为三个情况,第一种是单进程,一个服务端只能有一个客户端;第二种是多进程,一个服务端可以接受多个客户端;第三种是多线程,相对于多进程而言更稳定,因为线程相对于进程是各自私有资源,各自独立。第一种—–单进程tcp_client 客户端 1 #include 2 #include 3 #include 4 #include 5 #include

2017-07-14 10:28:06 6415

原创 shell脚本命令代换

“”和()反引号在shell脚本中有独特的作用,凡是被反引号包括的内容shell会先执行该命令,再将该命令的输出结果代换到当前命令行中。所以反引号的作用是命令替换。()则是算数代换,在shell脚本中,被双括号括起来的算数命令可以被替换成算术结果。 $(())中只能用+ - * / %运算符进行算数运算,而且只能做整数运算。 `command`:反引号引起来的是一条命令;eg:DATE

2017-07-14 10:22:07 261

原创 拷贝与拷贝构造的优化

在c++中,传参和传返回值时,如果是引用类型,则不用调用拷贝构造函数,直接返回别名。当语句为一个表达式时,编译器会选择优化,将构造函数与拷贝构造合并。在C++中,调用几次构造函数和拷贝构造函数,就会相应的调用几次析构函数。只有当一个对象已经存在时,d=f()才调用赋值运算符重载,如果对象不存在,则调用的是构造函数。完成下面的题目。Test1中调用了_2_

2017-07-14 10:10:24 295

原创 Sting类的拷贝构造

在自己定义的String类中使用写实拷贝来提高效率。写实拷贝是在浅拷贝的基础上使用引用计数器来拷贝对象,如果有对象被拷贝构造时只需要将计数器++,不用再开辟新的空间。初版的代码:#define _CRT_SECURE_NO_WARNINGS 1#includeusing namespace std;class String{public: String(con

2017-07-13 12:26:42 269

原创 C++动态内存管理

1、malloc/free和new/delete之间关系和差异。C通过malloc/free来管理动态内存,而C++通过new/delete管理动态内存。malloc/free的使用方法与new/delete有所不同。malloc/free:[plain] view plain copyint main()  { 

2017-07-13 12:01:17 247

原创 日期类

Date类的编写要求如下,编写构造函数以及运算符的重载,以及测试基础代码class Date{                                      public: Date(int year = 1900, int month = 1, int day = 1) :_year(year) ,_month(month) ,_day(day) 

2017-07-13 11:58:35 180

原创 gdb调试

gdb多进程调试我们可以对fork出来的进程进行设置调试方法。follow-fork-mode的用法为:set follow-fork-mode parent/child11如果你选择了parent,这个时候就是进行gdb调试父进程。 如果你选择了child,这个时候就是进行gdb调试子进程。示例程序:#include#include#include

2017-07-13 11:53:09 201

原创 可重入函数与线程安全

线程安全:当一个函数被多个并发进程反复调用时,它会一直产生正确而的结果,称其为线程安全的。若一个函数不是线程安全的,就称其为线程不安全的。线程安全就是说多线程访问同一代码,不会产生不确定的结果。换句话说,线程安全就是多线程访问时,采用加锁机制,当一个线程访问该类的某个数据时,用锁对数据进行保护,其他线程不能访问该数据直到该线程读取完,其他线程才可使用,线程安全不会出现数据不一致或者数据污染

2017-07-13 11:50:16 270

原创 TCP定时器

TCP使用四种定时器 重传计时器   坚持计时器   保活计时器   时间等待计时器(1)重传计时器:重传定时器:为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间。当TCP发送报文段时,就创建这个特定报文段的重传计时器,可能发生两种情况:若在计时器超时之前收到对报文段的确认,则撤销计时器;若在收到对特定报文段的确认之前计时器超时,则重传该报文,并把计时器复位;

2017-07-13 11:43:18 167

原创 C++入门基础知识

命名空间命名空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字。名字空间域解决全局命名冲突的问题.标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在采用标准C++的平台上使用标准C++库中的组件,只要写一个using指示符:using namespace

2017-06-30 14:52:05 273

原创 crond和crontab调研

crontab常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。crondcrond,与crontab是不可分割的,是crontab的守护进程。crontab file的格式 crontab文件中的行由6个字段组成,如下图所示: 其中各项格

2017-06-30 14:45:49 257

原创 CRC检验码

1. 定义        CRC  即循环冗余校验码:是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。在链路层被广泛使用的检错技术。 循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似算法,以保证数据传输的正确性和完整性。 2. 原理        在数据链路层传送的帧中,

2017-06-29 22:51:37 676

原创 C++类和对象

类和对象类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间。而对象是类这种数据类型的一个变量,或者说是通过类这种数据类型创建出来的一份实实在在的数据,所以占用内存空间。 类的定义 类是用

2017-06-29 22:40:36 228

原创 C++实现复数类

Complex类的成员变量有实部与虚部:                                       protected:                                                        double _real;                                                  

2017-06-29 22:32:58 1774

原创 守护进程

守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。守护进程的特点有:(1)自成一个会话,即会话id是守护进程的pid,SID==PID                                  (2)自成一个进程组,即组长id是守护进程的pid   

2017-06-29 22:23:05 271

原创 C语言实现无头节点单链表

测试代码singlelinkedlist.h头文件#ifndef __SINGLELINKEDLIST_H__#include#include#includetypedef int DataType;typedef struct ListNode{ DataType data; struct ListNode *next;}ListNode;Lis

2017-06-14 22:34:33 1059

原创 C语言单链表面试题2

题目判断单链表是否带环?若带环,求环的长度?求环的入口点?并计算每个算法的时间复杂度&空间复杂度。判断两个链表是否相交,若相交,求交点。(假设链表不带环)判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】求带环链表环长(无环返回 -1)思路:快慢指针法,快指针一次走两步,慢指针一次走一步,如果链表带环,则从慢指针到达入口点开始,由于快慢

2017-06-14 22:20:58 201

原创 C语言单链表面试题1

题目总览从尾到头打印单链表删除一个无头单链表的非尾节点在无头单链表的一个节点前插入一个节点单链表实现约瑟夫环逆置/反转单链表单链表排序(冒泡排序&快速排序)合并两个有序链表,合并后依然有序查找单链表的中间节点,要求只能遍历一次链表查找单链表的倒数第n个节点,要求只能遍历一次链表思路及代码从尾到头打印单链表递归法,若当前节点不为

2017-06-14 22:17:06 165

原创 读写锁

读写锁实际是一种特殊的 自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于 自旋锁而言,能提高 并发性,因为在 多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。在读写锁保持期间也

2017-06-05 17:08:06 347

原创 消费者生产者模型

代码:实现结果:

2017-06-05 17:06:50 138

原创 死锁

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。虽然进程在运行过程中,可能发生死锁,但死锁的发生也

2017-06-04 21:41:41 176

原创 实现共享内存

comm.hcomm.cserver.cclient.c实现结果:监控没执行时,root用户nattch为0执行server.c,nattch为1执行client.c,nattch为2

2017-05-23 22:31:30 167

原创 信号量的实现

comm.hcomm.ctest_sem.c运行结果:可以看到A\B交替规律输出。

2017-05-22 13:20:59 233

原创 信号量SEM_UNDO设置

信号量的本质是计数器,只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:  P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行  V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.   举个例子,就是 两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信

2017-05-19 22:19:41 734

原创 消息队列的实现

comm.hcomm.cclient.cserver.c

2017-05-17 23:06:22 263

原创 测试管道的容量

测量管道容量用Makefile 生成两个可执行程序

2017-05-13 23:43:13 473

原创 管道的四种读写情况

创建一个管道:子进程关闭读端,父进程关闭写端。管道读写数据时有四种情况:1 读方不关闭读端,但是写方一直在写,直至写满缓冲区。2 读方一直读,写方不写,父进程一直等待3 写方一直在写,读方读了一部分后退出,此时会产生SIGPIPE信号。4 写方不写了,将写端关闭,读方一直读,直到把之前的读完,相当于读到了文件,read

2017-05-13 19:36:44 4121

原创 fd与FILE*的关系

1 FILE结构体的内容struct file结构体定义在/linux/include/linux/fs.h)中,文件结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码中,struct file的指针通常被命名为f

2017-05-01 17:00:18 1492

原创 atexit函数的调用与exit函数和_exit函数的区别

1 atexit()函数头文件:#include功 能: 注册终止函数(即main执行结束后调用的函数)用 法: int atexit(void (*func)(void));注意:按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用。atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们 登记时候

2017-05-01 16:48:02 540

原创 可变参数列表源码的剖析

先剖析printf函数#include intmain(int argc, char const *argv[]){        printf("hello c\n");         printf("%s\n""hello world\n""%d\n", argv[0], argc); return 0;}printf库函数接收的参数可以是多个,这里的多个是

2017-04-21 23:27:24 232

原创 函数的调用过程,栈帧的创建和销毁。

#includeint Add(int x, int y){int c = 0;c = x + y;return c;}int main(){int a = 10;int b = 20;int c = 0;printf("%d\n", Add(a, b));system("pause");return 0;}理解执行的

2017-04-20 17:06:06 461

原创 task_struct结构体

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,task_struct是Linux中的【进程控制块PCB结构】的具体数据结构这个结构体包含了一个进程所需的所有信息。它定义在Linux-2.6.38.8/include/linux/sched.h文件中。下面对task_struct这个结构体 进行各个字段的详细介绍1. 调度数据成员

2017-04-09 15:42:32 239

原创 数组

//一维数组int a[] = {1,2,3,4};printf("%d\n",sizeof(a));  //求数组大小                              16printf("%d\n",sizeof(a+0)); //求第一个元素的大小           4printf("%d\n",sizeof(*a)); // 第一个元素

2017-04-05 21:34:17 208

原创 vim配置

2017-04-03 23:10:37 141

空空如也

空空如也

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

TA关注的人

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