Linux
文章平均质量分 83
huangjh2018
这个作者很懒,什么都没留下…
展开
-
C++学习笔记之——如何写一个异常处理
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。此时,检测出问题的部分应该发出某种信号以表明程序遇到了故障,无法继续下去了,而且信号的发出方无需知道故障将在何处得到解决。一旦发出异常信号,检测出问题的部分也就完成了任务。异常处理机制为程序中异常检测和异常处理这两部原创 2017-04-10 15:50:08 · 1037 阅读 · 0 评论 -
我的网络编程学习之路——套接字选项
1.1 概述我们可以使用很多方法来获取和设置影响套接字的选项:getsockopt 和 setsockopt 函数;fcntl 函数;ioctl 函数。我们会从介绍getsockopt 和 setsockopt 函数开始,然后介绍所有的套接字选项。我们按以下分类进行详细介绍:通用、IPv4、IPv6、TCP和SCTP。最后,我们还介绍fcntl函数,因为它是把套接字设置为非阻塞原创 2017-06-19 21:11:18 · 1163 阅读 · 0 评论 -
程序随笔——timestamp(时间戳)
在实际编程中,经常需要用到时间戳。因此,对Linux上的一些时间API进行封装,实现了个CTimestamp类,该类的内部用一个int64_t类型来存储时间,时间精度为微秒。类重载了比较,提供了转换为字符串的方法。原创 2017-07-12 22:16:06 · 4473 阅读 · 0 评论 -
我的网络编程学习之路——套接字地址结构
1.套接字地址结构大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。每个协议族都定义它自己的套接字地址结构。这些结构的名字均以sockaddr_开头,并以对应每个协议族的唯一后缀结尾。1.1 IPv4套接字地址结构IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在文件中。struct in_addr { in_addr_t原创 2017-06-13 20:11:13 · 1728 阅读 · 0 评论 -
我的网络编程学习之路——poll函数
poll函数提供的功能与select函数类似,不过在处理流设备时,它能够提供额外的信息。原创 2017-07-05 21:19:08 · 391 阅读 · 0 评论 -
我的网络编程学习之路——epoll函数
1. 概述同 I/O多路复用和信号驱动I/O一样,Linux的epoll(event poll)API可以检查描述符上的I/O就绪状态。epollAPI的主要优点如下。当检查大量的文件描述符时,epoll的性能延展性比select()和poll()高很多。epoll API既支持水平触发也支持边缘触发。与之相反,select()和poll()只支持水平触发,而信号驱动I/O只支持边原创 2017-07-06 20:44:07 · 4015 阅读 · 1 评论 -
GCC关键字__thread
最近,在一些代码中发现了个很有意思的关键字——__thread。在多线程编程中,这个关键字算是很有作用的。虽然很有用,不过该关键字是GCC编译器提供的,因此如果考虑到跨平台的情况下,就需要谨慎考虑了。关于__thread关键字,我们需要作一些说明:__thread是GCC内置的线程局部存储设施,其存储效率可以和全局变量相比;__thread变量在每一个线程中都有一份独立实例,各线程值是互不干扰的。同时__thread关键字的使用也有自身的限制:只能修饰POD类型(类似整型指针的标量,不带自定义的构原创 2017-07-08 15:08:59 · 2221 阅读 · 0 评论 -
利用文件描述符进行通知的定时器:timerfd
timerfd API 是Linux系统特有的,Linux是在内核版本2.6.25中提供的。它可以从文件描述符中读取所创建定时器的到期通知。因为可以使用select()、poll()和epoll()将这种文件描述符同其他描述符一同进行监控。这组API中的3个系统调用,其操作与timer_create()、timer_settime()和timer_gettime()相类似。新加入的第1个系原创 2017-07-10 22:08:06 · 2353 阅读 · 0 评论 -
__attribute__((format(printf, a, b)))
最近,在看libevent源码,第一次看到__attribute__((format(printf, a, b)))这种写法。因此,在这里记录下用法。功能:__attribute__ format属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。format属性告诉编译器,按照printf, scanf等标准C函数参数格式规则对该函数的参数进行检查。这在我们自己封装调试信息的接口时非常的有用。format的语法格式为:原创 2017-08-08 22:11:04 · 12689 阅读 · 3 评论 -
Linux线程同步之——互斥量(Mutex)
当我们在进行多线程编程的时候,如果有多个线程共享相同的内存时,我们需要确保每个线程看到一致的数据视图。如果每个线程使用的变量都是其他线程不会读取和修改的,或对每个线程是只读的,那么久不存在一致性的问题。但是,当一个线程可以修改变量,其他线程同样也能读取或修改变量的时候,我们就需要对这些线程进行同步。在Linux上进行多线程编程时,我们常用到互斥量(Mutex)。 互斥量(Mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放锁。当我们对互斥量进行加锁之后,任何其他试图再次对互原创 2017-03-07 19:22:20 · 4869 阅读 · 1 评论 -
GCC提供的加减和逻辑原子操作
在实际的编程中,我们不免需要对变量进行加减和逻辑操作。由于对变量的加减和逻辑操作并不是原子操作,在单线程编程中这并不会有什么的影响;在多线程编程中这就会造成问题。在多线程编程中,如果需要对同一变量进行访问。那么我们最先想到的可能是利用线程的同步机制(比如互斥量)制造出一片线程安全的区域,并在这片区域对变量进行访问。这似乎“合情合理”,确实这种做法是正确的,它的确能确保对变量访问的线程安全,但某些情况下,这种处理方式效率是低下的。gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供原创 2017-04-03 17:47:01 · 1983 阅读 · 0 评论 -
Linux线程同步之——条件变量
条件变量是线程可用的另一种同步机制。条件变量给多线程提供了一个会合的场所。它主要包括两个动作:一个线程等待“条件变量的条件成立”而挂起;另一个线程使“条件成立”(给出条件成立信号)。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。pthread_cond_init,pthread_cond_destroy,pthread_cond_wait,pthread_cond_signal,pthread_cond_broadcast原创 2017-04-05 20:40:00 · 551 阅读 · 0 评论 -
程序随笔——C++实现的一个线程池
1.线程池简介线程池是一种多线程处理形式,处理过程中我们将相应的任务提交给线程池,线程池会分配对应的工作线程执行任务或存放在任务队列中,等待执行。我们知道在面向对象编程中,创建和销毁对象是需要消耗一定时间的,因为创建一个对象要获取内存资源或者其它更多资源。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个原创 2017-06-10 17:02:13 · 605 阅读 · 0 评论 -
高效的将整型类型转换为字符串的方法
最近在项目中需要用到将数字转换为字符串,这里主要记录在使用过程中的一些思考。说到如何将数字转换为字符串,我们可能先想到的是C函数库提供的snprintf等系列的函数或是C++库提供的功能更为强大的stringstream对象来进行转换。没错C函数库提供的snprintf等系列函数非常的好用和方便。例如:我们想要将一个int型的数值转换为对应的字符串。#include #i原创 2017-04-29 13:53:38 · 4492 阅读 · 0 评论 -
Linux多线程编程(三)——线程特定数据
在这一篇章中我们主要来讲讲线程特定数据。线程特定数据,也称为线程私有数据,是存储和查询某个特定线程相关数据的一种机制。引入这个机制的原因是:有时候我们希望每个线程可以访问它自己单独的数据副本,而不需要担心与其他线程的同步访问问题。我们知道一个进程中的所有线程都可以访问这个进程的整个地址空间。除了使用寄存器以外,一个线程没有办法阻止另一个线程访问它的数据。线程特定数据也不例外。虽然底层的实现部分并不能阻止这种访问能力,但管理线程特定数据的函数可以提高线程间的数据独立性,使得线程不太容易访问到其他线程的线程原创 2017-05-08 20:34:27 · 408 阅读 · 0 评论 -
Linux多线程编程(二)——线程属性
pthread接口允许我们通过设置每个对象关联的不同属性来细调线程的行为。在上一篇中我们调研pthread_create函数的实例中,传入的参数都是空指针,而不是指向pthread_attr_t结构的指针。可以使用pthread_attr_t结构修改线程默认 属性,并把这些属性和创建的线程联系起来。可以使用pthread_attr_init函数初始化pthread_attr_t。在调用pthread_attr_init以后,pthread_attr_t结构所包含的就是操作系统实现支持的所有线程属性的默认值原创 2017-04-23 11:01:07 · 314 阅读 · 0 评论 -
Linux多线程编程(一)——线程创建
1.1线程的概念线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另原创 2017-04-19 21:58:47 · 415 阅读 · 0 评论 -
我的网络编程学习之路——主机字节序和网络字节序
1.字节序当我们与同一台计算机的进程进行通信时,一般不用考虑字节序。什么是字节序——字节序是一个处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有2种方法:一种是将低序字节存储在起始地址,这称为小 端字节序;另一种方法 是将高 字节序存储在起始地址,这称为大端字节序。原创 2017-06-15 20:47:40 · 428 阅读 · 0 评论 -
我的网络编程学习之路——基本的TCP套接字API
1.1 概述在这个篇章里面主要讲解编写一个完整的TCP客户/服务器程序所需要的基本套接字函数。这些API包括socket、connect、bind、listen和accept。1.2 socket函数为了执行网络I/O,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP、Unix域字节流协议等)。原创 2017-06-15 22:04:35 · 477 阅读 · 0 评论 -
用C++简单实现的——BlockingQueue类(java)
最近,简单整理完Linux线程方面的知识点,突发奇想的想写个线程池来玩玩。经过多方的考虑,决定仿java的线程池来写。由于没有学过java,最后的结果可能差距很大,好像扯远了回到正题来。Java线程池中使用到了BlockingQueue类那就先来试着用C++来实现它吧!最终只实现了BlockingQueue中的ArrayBlockingQueue(基于数组的阻塞队列实现)和LinkedBlockingQueue(基于链表的阻塞队列)也只实现了BlockingQueue中4个核心的方法。好像对线程池来说够用原创 2017-05-12 15:23:50 · 841 阅读 · 0 评论 -
我的网络编程学习之路——getsockname 和 getpeername 函数
这两个函数或者返回与某个套接字关联的本地协议地址(getsocketname),或者返回与某个套接字关联的外地协议地址(getpeername)。原创 2017-06-18 10:48:47 · 761 阅读 · 0 评论 -
我的网络编程学习之路——TCP(流)套接字的读和写
1. 函数 read 和 write流字节套接字(例如TCP套接字)上的read和write函数所表现的行为不同于通常的文件I/O。字节流套接字上调用read或write输入或输出的字节数可能比请求的数量少(我们称之为部分读和部分写),然而这不是出错的状态。这个现象的原因在于内核中用于套接字的缓冲区可能已达到了极限。此时所需要的是调用者再次调用read或write函数,以输入或输出剩余的字节。原创 2017-06-18 13:52:37 · 2488 阅读 · 0 评论 -
我的网络编程学习之路——TCP和UDP
1.1 概述本篇我们的焦点是传输层,包括TCP、UDP。绝大多数客户/服务器网络应用使用TCP或UDP。UDP是一个简单的、不可靠的数据报协议,而TCP是一个复杂、可靠的字节流协议。这里我们将阐述以下相关主题:TCP的三路握手、TCP的连接终止序列和TCP的TIME_WAIT状态,加上由套接字提供的TCP和UDP的缓冲机制等。1.2 总览虽然协议族被称为“TCP/IP”,但除了TC原创 2017-06-22 21:20:47 · 434 阅读 · 0 评论 -
我的网络编程学习之路——地址转换函数
inet_pton 和 inet_ntop 这两个函数是随IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。当然还有inet_aton、inet_addr和inet_ntoa在点分十进制与它长度为32位的网络字节序二进制值间转换IPv4地址。这里我们一般使用前两个函数。原创 2017-06-19 20:25:32 · 468 阅读 · 0 评论 -
在android-ndk上编译boost库及其C/C++程序
1. 简介 最近,项目的需求——将原本运行在Linux的上C/C++移植到Android上运行。折腾了3天,终于可以编译出使用了boost库的可执行程序。这边主要是记录下,并分享出来,供需要的人员参考。如果有什么问题可以在下面评论或发私信。2. android-ndk在Linux上的安装 博主的ndk版本是从底层的驱动人员那边获取的。这边使用的ndk版本是:android-ndk3原创 2018-01-16 20:21:29 · 9673 阅读 · 0 评论