随笔分类 - Linux
驱动、内核、应用、Shell
摘要:本文主要对比Muduo多线程模型方案8 和方案9 。 方案8:reactor + thread pool ,有一个线程来充当reactor 接受连接分发事件,将要处理的事件分配给thread pool中的线程,由thread pool 来完成事件处理。实例代码见:examples/sudoku...
阅读全文
摘要:NPTL提供了互斥体 pthread_mutex_t 类型进行线程同步,防止由于多线程并发对全局变量造成的不正确操作。使用 pthread_mutext_t 对数据进行保护已经可以实现基本的数据同步,NPTL又提供了pthread_cond_t 条件变量与pthread_mutext_t一起使用...
阅读全文
摘要:多线程程序中为了防止线程并发造成的竞态,需要经常使用到Mutex进行数据保护。posix提供了phtread_mutex_t进行互斥保护数据。Mutex的使用需要初始化和释放对应(phtread_mutex_init() 和 phtread_mutex_destroy() 对应),上锁和解锁对应...
阅读全文
摘要:之前canonical取消了wubi,在ubuntu14.04的ISO里面又发现了这个玩意儿,使用wubi安装很简单。将ISO解压出来之后双击wubi.exe 不断向下操作进行了(途中会出现一些错误提示,先不要管)。 但是当安装完成之后发现无法进入图形界面,在命令行“startX”神马的也不行...
阅读全文
摘要:Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自...
阅读全文
摘要:首先,我们要知道,0长度的数组在ISO C和C++的规格说明书中是不允许的。这也就是为什么在VC++2012下编译你会得到一个警告:“warning C4200: 使用了非标准扩展 : 结构/联合中的零大小数组”。那么为什么gcc可以通过而连一个警告都没有?那是因为gcc 为了预先支持C99的这种玩法,所以,让“零长度数组”这种玩法合法了。关于GCC对于这个事的文档在这里:“Arrays of Length Zero”,文档中给了一个例子(我改了一下,改成可以运行的了):#include #include struct line {int length;char contents[0]; //
阅读全文
摘要:本文转自GeekFan,感觉确实比较极客范啊,[TAB][TAB]补全都知道,但是你知道可以定制化补全吗?-------------------------------------------------------------------------------------------------------本文由极客范-踏雁寻花翻译自Balakrishnan Mariyappan。欢迎加入极客翻译小组,同我们一道翻译与分享。转载请参见文章末尾处的要求。在Linux系统中,输入一个命令,再按两次TAB键,就会列出所有以输入字符开头的可用命令。这并不新鲜,很可能你已经知道了这个。这个功能被称作
阅读全文
摘要:在嵌入式linux平台使用gdb调试进行远程调试需要安装gdbserver,gdbserver工作在目标板上,通过串口或者网线与主机上的gdb互联实现远程调试。 Gdbserver需要根据不同的嵌入式平台来编译生成,首先到http://ftp.gnu.org/gnu/gdb/下载合适的版本。然后在本地进行编译。在Unbuntu下编译gdb需要安装ncurses 库,在redhat上通过yum install “Development tools” 安装依赖就可以了。 首先编译主机端gdb,编译过程如下: 解压源码包: $> tar xzvf gdb 7.3.1.tar.gz 进入...
阅读全文
摘要:据说再高的高手在写多线程程序的时候都难确保不会产生死锁,死锁的调试也就成为一个比较常见的问题,假设有下面这样一个问题: 一个正在生产环境下运行的进程死锁了,或者你只是在跑一个程序,并没有在调试器里面打开它,然后发现没有响应,日志输出也停止了。由于你是一个有经验的程序员,会想到“我刚刚加上了新的锁策略,不一定稳定,这可能是死锁了“。但是你不想就这么杀掉进程,因为多线程的 bug 不容易重现,遇上一次死锁可能要凭运气,错过了这次,它下次死锁可能会出现在你演示给老板看的时候……怎么办? 对于这样的问题可以借助Core Dump来调试。 什么是Core Dump? Core的意思是内存, ...
阅读全文
摘要:Packet, Raw, Netlink, and Routing Sockets :Netlink, routing, packet, and raw are all types ofspecialized sockets.Netlink provides a socket-based interface for communication of messages and settings between the user and the internal protocolsRtnetlinkis forapplication-level managementof theneighbor t
阅读全文
摘要:Chapter 5: Linux SocketsSockets provide a standardprotocol-independent interfacebetween the application-level programs and the TCP/IP stack.From the viewpoint of TCP/IP,everything above the transport layer is part ofthe application.The socket API is the best known networking interface for Unix appli
阅读全文
摘要:/***netif_rx-post buffer to the network code*@skb: buffer to post**This function receives a packet from a device driver and queues it for*the upper (protocol) levels to process. It always succeeds. The buffer*may be dropped during processing for congestion control or by the*protocol layers.**return
阅读全文
摘要:Chap-3:TCP/IP in Embedded SystemsTwo guiding principlesallow protocol stacks to be implemented as shown in the OSI model:information hidingandencapsulation.Thephysical layer(PHY) isresponsible forthemodulationandelectrical details of data transmission.One of theresponsibilitiesof thedata link layeri
阅读全文
摘要:rtl8139 网卡驱动分析:(注:这里只分析了主要函数,代码版本是:8139too.c71420 bytes2010-04-01 22:56:18)/* * 提供了一系列驱动程序可调用的接口,主要用于发现和初始化设备 */static struct pci_driver rtl8139_pci_driver = { .name = DRV_NAME, .id_table = rtl8139_pci_tbl, .probe = rtl8139_init_one, .remove ...
阅读全文
摘要:紧接上一篇,这里简要介绍net_device 结构和网卡驱动框架。 struct net_device 是一个比sk_buff 更复杂的结构,里面包含了与TCP/IP协议栈通信的接口函数,但是自从2.6.31 之后的内核中这些接口函数就被封装在了 stuct net_device_ops 结构中,在net_device 结构中以 netdev_ops 成员的形式出现。我们就来看如何使用该结构:1. 在初始化幻术中驱动需要分配一个net_device 结构,可以使用alloc_netdev()函数,也可以使用一个更常用的函数 alloc_etherdev() 函数来实现。这个函数在创建...
阅读全文
摘要:接上一篇,我们来看与skb相关的一些重要函数:网络模块中,有两个用来分配SKB描述符的高速缓存,在SKB模块初始函数skb_init()中被创建:void __init skb_init(void){skbuff_head_cache = kmem_cache_create("skbuff_head_cache", sizeof(struct sk_buff), 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);skbuff_fclone_cache = kmem_cache_create("skbuff_fclone_cache&q
阅读全文
摘要:参考:1. 深入理解Linux网络技术内幕 PartIII 2. Essential Linux Device Driver Chap15 3. Linux 内核源码剖析——TCP/IP 实现 5. rtl8139too.c 2010.4 修订 6. Linux 内核 2.6.33 7. google当你在写一个网卡驱动的时候回接触到3个重要的数据结构:1. struct sk_buff sk_buff 结构贯穿整个协议栈2. struct net_device 该结构定义了网卡驱动和协议栈之间的接口3. I/O 总线相关的结构,比如 struct pci_...
阅读全文
摘要:要实现的功能C语言编程Linux Shell脚本编程程序/脚本的参数传递intmain(intargc, char**argv){if (argv!= 4) {printf( “Usage: %s arg1 arg2 arg3”,argv[0] );return 1;}printf(“arg1:%s/n”,argv[1]);printf(“arg2:%s/n”,argv[2]);printf(“arg3:%s/n”,argv[3]);return 0;}#!/bin/shif [ $# -lt3 ]; thenecho "Usage: `basename$0` arg1 arg2 a
阅读全文
摘要:1.变量赋值a=123readnameb=$(ls/home)把命令的执行结果赋值给变量2.使用变量(前面用$)echo$aleta=a+1系统变量$0 这个程序的执行名字 $n 这个程序的第n个参数值,n=1...9 $* 这个程序的所有参数 $# 这个程序的参数个数 $$ 这个程序的PID $! 执行上一个背景指令的PID $? 上一个指令的返回值 3.if语句if [ "22" -lt "33" ]注意空格thenecho "22 less than 33"elseecho "no"fi4.case语句#!/
阅读全文
摘要:听说过sed 和 awk 比较强大,专门学习了一下。使用这些shell工具需要一些正则表达式的知识,这里先来了解一些特殊符号的意思:特殊符号代表意义[:alnum:]代表英文大小写字节及数字,亦即 0-9, A-Z, a-z[:alpha:]代表任何英文大小写字节,亦即 A-Z, a-z[:blank:]代表空白键与 [Tab] 按键两者[:cntrl:]代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等[:digit:]代表数字而已,亦即 0-9[:graph:]除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键[:lower:]代表小写字节,亦即 a-
阅读全文