linux
文章平均质量分 73
baidu20008
这个作者很懒,什么都没留下…
展开
-
shell脚本中的控制流结构
习惯了c/c++的编程环境,再转到shell编程上,总有那么一点陌生的感觉。shell中一般的if-then-else函数格式无外乎如下:if 条件1then 命令1elif 条件2then命令2else 命令3fi而linux中若命令退出状态为0,则退出成功,无错误;若退出状态为1,则退出失败,某处有错误。if-then-else-函数中,条原创 2013-08-06 21:17:47 · 980 阅读 · 0 评论 -
linux服务器编程初步
若对服务器进行分类,如果按照对于事件处理机制来分,则可以划分为迭代服务器和并发服务器。 所谓的迭代服务器是指在完成对当前客户的服务之前无法处理已等待服务的新客户,即是串行为客户服务的。而并发服务器则是并发地同时地为多个客户提供服务。 本文实现两个最初级版本的两种服务器。首先介绍客户端/* Author: time:2014/02/24 func:i原创 2014-02-25 09:28:51 · 868 阅读 · 0 评论 -
openlldp-0.4alpha实现详解(一)
LLDP协议由802.1ab所定义。它是一个二层协议,一般称之为数据链路发现协议。这里对于该协议的实现原理不做详细介绍。具体原理可以参见IEEE 802.1ab文档(http://www.ieee802.org/1/pages/802.1ab.html)。 OpenLLDP为802.1ab的开源实现,号称支持Linux,macOS,FreeBSD,NetBSD等众多类unix系原创 2013-12-13 11:14:37 · 4292 阅读 · 2 评论 -
openlldp-0.4alpha实现详解(三)——lldp_linux_framer模块
该主要数lldp报文的缓存和缓存报文的发送,以及一些原始套接字的创建和本地基本信息的获取。一些主要函数如下:int socketInitializeLLDP(struct lldp_port *lldp_port){ struct ifreq *ifr = calloc(1, sizeof(struct ifreq)); struct sockaddr_ll *sll = cal原创 2014-02-19 11:23:55 · 2647 阅读 · 0 评论 -
openlldp-0.4alpha实现详解(四)——rx_sm模块
该模块完成接收状态机的跳转以及接收帧所进行的相关处理。 lldp的接收状态机,参见lldp标准文档。该实现代码和标准文档基本一致,变量名和函数名都大部分相同。int rxProcessFrame(struct lldp_port *lldp_port) {……/*主要是验证报文的正确性:具体要验证报文的目的地址以及报文类型字段*//* As per section 1原创 2014-02-19 12:38:13 · 2487 阅读 · 0 评论 -
udp的close系统调用
在印象中,是只有tcp才需要调用close来关闭套接字描述符的,而udp需要与否是无关紧要的。这种直接的印象源于tcp是一个面向连接的协议,而udp则不是。因此对于一条连接,我们需要将其关闭而没有连接的则不需要。而事实并非如此。 就刚不久之前,项目遇到了这样的一个问题:在一个多次循环中,每次循环都会创建一个udp的无连接的套接字,但是循环结束时却没有调用close来关闭这个套接字描述符原创 2014-03-17 20:00:17 · 3700 阅读 · 0 评论 -
linux进程之间互斥
总所周知,在linux中pthread_mutex_t原创 2014-04-15 20:24:57 · 4177 阅读 · 0 评论 -
linux内核线程cpu占用100%?!
在项目中遇到内核线程占用几乎100%的现象,而且内核模块不可卸载。在查找资料之后,一个可行的模板如下:#include #include #include #include #include #include #include #include #include // for DECLARE_COMPLETION()#include原创 2014-03-20 16:05:31 · 4806 阅读 · 0 评论 -
rstp设备之间的对接
项目需要将自己开发的运行rstp的设备和moxa交换机对接。在实际对接过程中,发现收敛速度提不上来。具体表现出来的就是两种设备P/A协商不成功。后来抓包发现,我们自己实现的rstp协议将在收到bpdu时,这样设置bpdu.role:switch ((buf[7] & 0x0c) >> 2){ case 1: p->bpdu.role = BR_BPDU_ROLE_ROOT;原创 2014-03-25 19:43:30 · 1323 阅读 · 0 评论 -
linux数据链路访问之ETH_P_ALL等等
linux自身有两种从接收分组:一种为fd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));另一种为fd=socket(AF_INET,SOCK_PACKET,htons(ETH_P_ALL));这其中协议族为PF_PACKET套接字使用较多。ETH_P_ALL自身定义于 /usr/include/linux/if_ether.h中,#原创 2013-08-23 15:16:08 · 21076 阅读 · 0 评论 -
为什么宏定义总是要使用do-while语句呢?
在阅读linux内核代码的过程中,经常会发现宏定义中使用了do-while语句。有时候觉得这种do-while语句显得有点多余?干嘛非得使用它把函数块包裹起来?像下面的#define MARCO_FUN1() do{\ Function();原创 2014-06-30 23:13:49 · 3008 阅读 · 2 评论 -
这里实现定界加锁线程安全的单例模式
具体实现代码为:#include#includeclass CLockGuard{public: CLockGuard(pthread_mutex_t* lock):m_LGLock(lock),owner(false) { GetLock(m_LGLock); } void GetLock(pthread_mutex_t* lock) { pthread_mut原创 2014-07-28 23:32:17 · 796 阅读 · 0 评论 -
这里实现一个基于数组的线程安全的循环队列
具体代码如下:#include#includeusing namespace std;#define QUEUESIZE 128templateclass ThreadSafeQueue{private: pthread_mutex_t m_lock; int m_front; int m_rear; object m_data[QUEUESIZE];public:原创 2014-07-30 23:32:13 · 2497 阅读 · 3 评论 -
openlldp-0.4alpha实现详解(六)——lldp_tlv、lldp_tlv_common、msap、lldp_neighbor模块
lldp_tlv主要是用来创建各种lldp报文所需的tlv,并提供验证。而lldp_tlv_common模块则是对于标准tlv进行修整。之前我们知道,lldp的tlv的type只有7个bit位,而length则有9个bit位,这样的结构对于程序的使用是十分不便的,故此进行转化。将7个bit位的type,转化为uint8_t。9bit的length转为为uint16_t的。 msa原创 2014-02-24 11:07:01 · 2536 阅读 · 1 评论 -
openlldp-0.4alpha实现详解(七)——lldp_main,lldpneighbors模块
lldp_main.c模块调用之前的各个模块的接口,实现lldp功能。使用select进行套接字的复用,每个一秒运行一次端口发送和接收状态机。#ifdef BUILD_SERVICE// We are building as a service, so this should be our ServiceMain()int ServiceMain(int argc, char *arg原创 2014-02-24 11:10:47 · 3503 阅读 · 1 评论 -
openlldp-0.4alpha实现详解(五)——tx_sm模块
该模块主要是构建了要传输的lldp报文,以及发送状态机的运转。该处实现的bug之一,就是shutdown报文并没有构建正确。且当本地信息发生变化时,并不会将somethingchangelocal置一,这样当本端有变动时,无法将最新的信息尽快的发送给直连邻居。还有当收到一个新的邻居信息时,不会立即进行回应。同时当lldp协议被置为disable时,理应发送shutdown报文。但这里并没有提供在协原创 2014-02-21 17:33:09 · 2181 阅读 · 1 评论 -
使用exec函数组调用执行shell脚本
linux下的exec函数不是单一的函数,而是一个函数组,分别为:int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ..., char * cons原创 2013-08-05 11:30:46 · 8675 阅读 · 0 评论 -
Linux netstat命令详解
原文请看这里:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。转载 2013-08-22 21:32:18 · 849 阅读 · 0 评论 -
Unix domain Socket
Unix域socket并不是用于不同主机的客户和服务器之间通信的套接字,它实际上是一个在单个主机上执行客户/服务器的通信方法,可以说是进程间IPC。 但是它和通常的通信套接字还是有些许不同的:首先就是使用的套接字地址不同unix domain socket 使用的是sockaddr_un,而不是sockaddr_in.sockaddr_un结构如下:struct sockadd原创 2013-08-23 12:02:04 · 1233 阅读 · 0 评论 -
linux route的底层实现
1. 实现前的准备工作我们首先应该知道可以用 route, ip 命令来设置系统的静态路由表。#route # <== 查看路由表Destination Gateway Genmask Flags Metric Ref Use Iface10.0.0.0 *转载 2013-08-27 09:16:30 · 1754 阅读 · 0 评论 -
IPC介绍——10个ipcs例子
ipcs是一个uinx/linux的命令。用于报告系统的消息队列、信号量、共享内存等1、列出所有的ipcs参数: -a 他是默认选项及ipcs等效于ipcs -a[root@test ~]# ipcs -a------ Shared Memory Segments --------key shmid owner转载 2013-08-27 14:55:48 · 970 阅读 · 0 评论 -
Linux 网络协议注册及内核对其的处理过程
1 Overview1.1 网络协议栈模型两个最著名的网络协议模型: 7 层的 OSI 模型和 5 层的 TCP/IP 模型, 如下图:Network protocol module后文的介绍以 TCP/IP 模型为主,数据在不同层中传递的时候, 需要知道使用何种协议来对代传输的数据进行处理, 例如,在 L2 层, 网卡驱动接收到了 skb转载 2013-09-10 20:54:10 · 2340 阅读 · 0 评论 -
linux/ubuntu下日志系统和syslog函数相关
网上一般介绍日志日志文件时,都说日志文件存放在/var/log/messages中,但是其实一般系统不同,日志文件存放的目录以及文件名都不尽相同。在ubuntu 3.8.0-19-generic下,日志文件存在于/var/log/syslog文件中,而非前面说说的那样。而对于配置文件,在ubuntu 3.8.0-19-generic下,存在于/etc/rsyslog.conf进行了说明(该文件原创 2013-09-04 22:12:56 · 8716 阅读 · 1 评论 -
dev_get_by_index的使用及struct net*参数
linux2.6.30里面使用dev_get_by_name通过设备名来获取网络设备实例,但是在之前的dev_get_by_name只有一个参数const char*,现在新版本的dev_get_by_name有两个参数,有如下的函数原型[Linux/net/core/dev.c]:715 struct net_device *dev_get_by_name(struct net *net原创 2013-09-24 20:10:43 · 6690 阅读 · 0 评论 -
linux的存储管理方式
这里问linux采用什么样的存储管理方式,是指主存(也就是内存)采用什么样的管理方式。 linux一般采用页式虚拟存储管理的方式。在页式虚拟存储系统中,将虚拟存储器划分为同样大小的页,c称为虚页或逻辑页,主存空间的页成为物理页。在编程时,程序的虚地址由高位字段的虚页号和低位字段的页内地址两部分组成,虚页号标识页。虚地址到实地址之间的变换是由页表来实现的。页表是一张存放在主存原创 2013-10-16 08:31:04 · 4022 阅读 · 0 评论 -
不使用itoa或sprintf等系统函数完成整型向字符串的转换
题目:问在不使用itoa或sprintf等系统函数的情况下,如何实现整型向字符串的转换?解题思路:思路相对简单。首先判断正负,若为负数则记录‘-’号。然后从低位逐个向高位进行转化。但这一方法的确定就是在转换完之后要颠倒除了符号之外的字符串。另外一种方法是直接在进行转换的时候,字符串颠倒记录。但这样也有缺点,会造成轻微的内存泄露。使用全局变量能够解决这一缺陷。先使用unsigned int来原创 2013-11-26 20:25:21 · 1531 阅读 · 0 评论 -
openlldp-0.4alpha实现详解(二)
接下来,看看openlldp的源代码src目录:这其中,platform目录包含了各种不同平台收发报文和获取网络接口信息的接口,主要是bpf和linux的。tlv模块包含了lldpdu中报文的创建,验收,销毁等等工作。lldp_debug模块包含了调试信息打印接口。lldp_neighbor模块包含了获取系统信息以及提取lldp邻居信息接口。lldpneighbors模块为查看邻居原创 2013-12-13 11:20:22 · 3130 阅读 · 3 评论 -
linux C内存泄露检测实现及内存泄露检测的一般方法
linux中,由于使用malloc或alloc而没有free掉申请的内存,就会造成内存的泄露。通常,来讲为了避免内存泄露的情况出现,一般要求,我们尽量的malloc之后,调用free。但是总会有忘记free的时候啊。 可以有如下几种方式来避免内存泄露:1) 使用智能指针,这个在C++中较为常见;2) 使用内存池3) 自己封装一层malloc/free等等。当申原创 2013-09-10 22:21:25 · 1516 阅读 · 0 评论 -
使用c++简单实现reactor模式
事件驱动模型广泛地应用于高性能的web服务器中。而相对应的事件处理模式,最为典型的就是Reactor模式(中文可以称作“反应器” “反应堆”等等,各种叫法都不一样,估且就使用英文吧,叫它Reactor模式)和Proactor模式(中文也称“主动器” “前摄器”,同前者一样称其为Proactor模式)。其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。在各种书籍上,能原创 2014-11-22 09:29:56 · 11925 阅读 · 0 评论