存档

‘*nix技术’ 分类的存档

函数导出可视问题

2013年5月25日 4 条评论 10,072 次浏览

最近从深圳裸辞回到了长沙,要忙的事情太多,当然,最主要的还是找工作的事情。长沙这边可投的公司实在是太少,但幸运的是,有不少同学和朋友的帮忙,而几个岗位的面试也都是十分的顺利,嘛,厚积薄发,继续努力,所以,来看本文主题:C语言里的函数导出可视问题。 这源于前几天去一家公司面试时做的一个试题,我们知道C语言里有一个很给力的关键字static,既可以修饰变量,也可以修饰函数。关于static的作用,在网上有很多描述,见参考1,2。这里重点关注的是:如果函数没有被static修饰,那么它就是全局可见的,而这对于创建动态共享库会带来一些麻烦,因为那些没有被static修饰的函数在默认情况下都成了导出函数。如果一个工程链接了多个动态共享库,而部分库又存在相同的函数名称时,也许我们链接使用的函数就不是原本期待的那个。之前在项目中就遇到过好几次这样的情况,如果参数不一致还好,因为能够在编译时就得到告警提示,从而及时解决,否则就需在实际执行时才发现程序行为异常,再做问题定位就稍显麻烦些了。 看实例: lenky@lenky-virtual-machine:~/work$... [阅读更多]

Lighttpd中CGI执行流程

2013年5月11日 没有评论 8,207 次浏览

这是2009年05月20日写在CU的博客上的文章,现在转过来,呵呵。 从下图中,我们可以看到对于客户端的每一个请求(动态页面,也就是需要CGI处理的),Lighttpd进程都是先fork一个CGI进程,然后将请求头(通过环境参数)和请求体(通过管道)传递给CGI程序,等待CGI处理并将从CGI进程那接收到的处理结果再响应给客户端,然后将CGI终止(通过发送SIGTERM信号)。 CGI的处理有一些缺点,先不说其它的,单从图中可以看到的就有:首先,对于客户端的每一个请求都需要fork一个CGI进程,然后在该请求处理结束后又将该CGI进程kill掉,性能自然是不高的。其次,Web... [阅读更多]

UbuntuKylin&友帮拓麒麟

2013年5月9日 没有评论 4,500 次浏览

搜索湖南麒麟公司时找到这么一个东东,很开心能在老家湖南看到这么一个开源软件/组织,立马拉下来用VMware装着试试,感觉挺好! 虽然捣鼓过不少Linux发行版,比如Redhat、Fedora、Debian、Ubuntu、Gentoo,但都只是图个新奇,而最喜欢用也用得最多的还是CentOS,毕竟它是一个企业服务器RHEL的演化版,各种稳定性/安全性会比较好。 试用过定位目标用户为普通大众的实用版Ubuntu,对于小白来说是各种便利,所以该发行版目前也非常受大众欢迎,系统装好之后,几乎所有软硬件都会给自动配置好,比如我这里用VMware安装UbuntuKylin后,网络也是连通的了,而我之前用其他发行版时还需做一些手动配置。 推荐大家试用一下,一个更有中国味的操作系统,支持一个已经成为Ubuntu官方认可的正式成员的项目。 百度百科介绍: http://baike.baidu.com/view/10186024.htm UbuntuKylin官网: http://www.ubuntukylin.com/ 欢迎来到UbuntuKylin桌面团队维基: https://wiki.ubuntu.com/UbuntuKylinChinese UbuntuKylin新手指南: https://wiki.ubuntu.com/UbuntuKylin/NewContributorGuide ... [阅读更多]

独立的调试符号文件

2013年4月29日 没有评论 8,754 次浏览

也许,我们还记得各大Linux发型版提供的debuginfo安装包,比如fedora:http://fedoraproject.org/wiki/Packaging:Debuginfo,这种将可执行程序与调试符号分离的方案好处多多。一方面,缩减了可执行程序的文件大小,在一定程度上提高了程序的执行性能,另一方面,对应的调试符号文件也方便了一些不时之需。本文就来看一下与此相关的两个问题。 一,如何给应用程序创建对应的调试符号文件? 这很简单,看个演示实例。有代码如下: #... [阅读更多]

分类: *nix技术, 跟踪调试 标签: ,

Intel 性能监视器之二

2013年4月21日 没有评论 19,345 次浏览

全文来自Intel开发者手册:Intel? 64 and IA-32 Architectures Software Developer’s Manual Volume 3B System Programming... [阅读更多]

死锁检测模块lockdep简介

2013年4月10日 没有评论 20,002 次浏览

在Linux系统里,假设有两处代码(比如不同线程的两个函数F1和F2)都要获取两个锁(分别为L1和L2),如果F1持有L1后再去获取L2,而此时恰好由F2持有L2且它也正在尝试获取L1,那么此时就是处于死锁的状态,这是一个最简单的死锁例子,也即所谓的AB-BA死锁。 死锁导致的最终结果无需多说,关于如何避免死锁在教科书上也有提到(参考1),最简单直观的做法就是按顺序上锁,以破坏死锁的环形等待条件。但对于拥有成千上万个锁的整个系统来说,完全定义它们之间的顺序是非常困难的,所以一种更可行的办法就是尽量提前发现这其中潜在的死锁风险,而不是等到最后真正出现死锁时给用户带来切实的困惑。 已有很多工具用于发现可能的死锁风险,而本文介绍的调试/检测模块lockdep,即是属于这一类工具的一种。调试模块lockdep从2006年(https://lwn.net/Articles/185666/)引入内核,经过实践验证,其对提前发现死锁起到了巨大的效果(http://lwn.net/Articles/321670/)。 官方文档(完全参考2)有介绍调试模块lockdep的设计原理,这里按照我自己的理解描述一下。 一,lockdep操作的基本单元并非单个的锁实例,而是锁类(lock-class)。比如,struct... [阅读更多]

中断栈溢出后的结果

2013年3月24日 没有评论 14,266 次浏览

说一下上文中最开始提到的“某个问题”:如果一台主机网卡比较多,然后每个网卡分队列又比较多,总之结果就是系统里的网卡设备的中断号比较多(关于超过256个中断数的情况,请见参考1,2,3),一旦所有这些中断都绑定到同一个CPU,那么如果网卡收到数据包进而触发中断,而众多硬中断一嵌套就非常容易出现中断栈溢出。一旦中断栈溢出,那么将会导致怎样的结果,这曾在之前的文章里隐含的提到过,这里再重新整理一遍。 在继续下面的描述之前,先看两个知识点: 1,Linux... [阅读更多]

Linux文件系统的日志功能

2013年3月17日 1 条评论 17,527 次浏览

所谓原子操作,即要么全部成功,要么全部失败。磁盘硬件可以保证对一个扇区的操作是原子的,也就是说对一个磁盘扇区进行写操作,那么结果只有两种:1,整个扇区被完全修改为新数据;2,整个扇区没有被做任何修改;而不会出现扇区半新半旧的混乱状态(比如前256字节为新数据,后256字节还为旧数据,这里假定一个扇区为512字节)。 如果需要对超过一个扇区的操作进行原子控制,那么就需要更高一级别的软件控制机制。这是必须的,否则将导致磁盘文件系统数据的不一致错误,在Linux上对应的软件控制机制为JBD(Journaling... [阅读更多]

分类: *nix技术, 文件系统 标签: , , ,

对Linux x86-64架构上硬中断的重新认识

2013年3月16日 1 条评论 7,635 次浏览

对于x86硬中断的概念,一直都落在理论的认识之上,直到这两天才(因某个问题)发现Linux的实现却并非如此,这里纠正一下(注意:Linux内核源码更新太快,一个说法的时效性太短,所以需注意我提到的香草内核版本,并且以x86-64架构为基准)。 以前的认识:Linux对硬中断(本文如无特殊说明,都是指普通意义上的可屏蔽硬件中断)的处理有优先级概念,高优先级硬中断可以打断低优先级硬中断。 重新认识: 1,对于x86硬件而言,在文档325462.pdf卷3章节6.9... [阅读更多]

如何对仅在指定调用路径下的函数断下断点

2013年3月16日 没有评论 7,148 次浏览

举个例子,有示例代码如下: # cat t.c #include <stdio.h> void foo() { printf("foo\n"); } void bar() { foo(); } void baz() { foo(); } int main() { bar(); baz(); bar(); ... [阅读更多]