信号之siginfo,sigvalue,sigmask

我本欲写一些关于信号的东西,不过发现网上已经有人写过了,而且写的还不错,例如ce123这位仁兄的博客:
http://blog.csdn.net/ce123/article/category/840137/1

信号默认行为

LINUX对信号做了一些注释,展示了信号的默认行为,可以参考:include/linux/signal.h

In POSIX a signal is sent either to a specific thread (Linux task)
or to the process as a whole (Linux thread group). How the signal
is sent determines whether it's to one thread or the whole group,
which determines which signal mask(s) are involved in blocking it
from being delivered until later. When the signal is delivered,
either it's caught or ignored by a user handler or it has a default
effect that applies to the whole thread group (POSIX process).

The possible effects an unblocked signal set to SIG_DFL can have are:
ignore - Nothing Happens
terminate - kill the process, i.e. all threads in the group,
similar to exit_group. The group leader (only) reports
WIFSIGNALED status to its parent.
coredump - write a core dump file describing all threads using
the same mm and then kill all those threads
stop - stop all the threads in the group, i.e. TASK_STOPPED state
继续阅读

SHELL命令执行的细节区别

如果你想执行如下命令行:

当然,直接执行就可以了,但是,当你在脚本里面写的时候,可能是几个变量拼接到一起,例如:

展开为:

echo出来看看:

等于:

继续阅读

Docker你为何这么火

是的,这就是一篇水文,吹水的水,笔者对自己的文字来源于自己的浅薄见识且不负任何责任。

互联网从来不缺会吹牛逼的人,当然,也从来不缺会吹牛逼的产品。

我们可能都说不清楚,Docker为何这么火,火到逢人你不开口说两句,都不好意思说你是搞虚拟化的(因为那些不搞虚拟化的老是跟你提)。

其实这也说明,这东西不够高深,你总没见那些不搞虚拟化的逢人便提,基于NVIDIA GRID 图形虚拟化切片GPU透传共享给VM带来OpenGL在3D虚拟化方面的性能进步。

至于为什么这么火,我觉得,这大概就是时势,时势造英雄,在正确的时间做了正确的事。

正确的时间:虚拟化云计算持续升温,越来越火热。
正确的事:让容器技术易用。

窃以为,Docker并没有什么新东西,可以说是新瓶装老酒,大家都知道,docker背后的技术大致是namespace, cgroups, unionFS,甚至你平时一定用过的chroot。这些东西都是已有技术,再加上这些年来比较火的github管理,成了它的又一个亮点。

就功能来说,docker最吸引人的地方,应该是容器的概念。
继续阅读

Makefile的内置规则

根据内置规则,写了一个简洁的Makefile模板wmakefile,可在github下载:
https://github.com/mnstory/wmakefile

编译一个.c或.cpp文件,一般分为:预处理,生成object文件,链接三个步骤。
你写一个Makefile,不是从零开始,make命令已经给你做了很多内置规则,称为builtin-variables和builtin-rules,make --help可以看到,通过:
-r, --no-builtin-rules Disable the built-in implicit rules.
-R, --no-builtin-variables Disable the built-in variable settings.
可以禁止内置规则。

写一个简洁的Makefile,当然要好好利用内置规则,通过make -p,可以将内置规则列出来,也可以参考文档:
https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html
内置变量详见:
https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

预处理过程

c++并没有对c语言的预处理做扩充,所以,能处理c语言的预处理命令完全可以用来处理c++语言,但是,这不代表g++和gcc命令预处理处理的东西完全相同,原因是编译工具也可能内置不同的预定义,比如,g++默认内置定义了__cplusplus和_GNU_SOURCE等,会导致gcc和g++预处理结果不一样,例如:

这样的宏在g++处理后就会存在,gcc处理后就不存在。
继续阅读

_GNU_SOURCE和__USE_GNU的差别

c-cpp.c:

用gcc编译不过,用g++可以:
$ g++ c-cpp.c
$ gcc c-cpp.c
c-cpp.c: In function ‘main’:
c-cpp.c:12:17: error: ‘REG_R8’ undeclared (first use in this function)
c-cpp.c:12:17: note: each undeclared identifier is reported only once for each function it appears in
继续阅读

JAVASCRIPT学习笔记

此文档为学习JAVASCRIPT语法记录的比较,学习教材为阮一峰开源的《JavaScript 标准参考教程》一书语法部分http://javascript.ruanyifeng.com/

语句

一条语句以换行或分号结束,和SHELL语法一样,所有,分号可写可不写,JS解释器会自动给你添加,这里说的自动还是比较智能的,比如:

它也能判断正确,解析为:

其原则是,没有分号,能和下行连接到一起,且语法有意义才会连接。

这里注意一点,return要返回的数据,不能单独成行,因为按照JS添加分号的原则:

解析成了:

继续阅读

bash in a netshell

GLOB

"Glob" is the common name for a set of Bash features that match or expand specific types of patterns.

* 匹配0或多个字符(不能匹配".")
? 匹配1个字符
[abc] 匹配括号里的任意一个字符
{b*,c*,*est*} 匹配括号里的任意一个串,例如
> ls {[0-9]*,[a-z]*}.{log,sh}
ls: cannot access [0-9]*.sh: No such file or directory
ls: cannot access [a-z]*.log: No such file or directory
324.log 3aa.log a.sh*
预定义 [:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:],
例如,匹配数字或"_"或"." [[:digit:]_.]
^或! 不匹配字符,例如,匹配非空白字符[![:space:]]

继续阅读

e1000e 驱动源码分析

驱动初始化与删除

我们从入口函数module_init(e1000_init_module)开始看,不过这个e1000_init_module简洁得只剩一句话pci_register_driver(&e1000_driver),看看e1000_driver如何定义:

定义一个PCI驱动,哪些PCI设备可以使用此驱动?
系统很热心,帮你把判断的代码写了,你只需提供匹配表即可,而.id_table就是匹配表。
你造吗?PCI有3种地址空间:I/O空间,内存地址空间,配置空间。而配置空间一个PCI的配置空间至少有256字节,布局如:

图片来源:http://blog.csdn.net/lamdoc/article/details/7698709
继续阅读