LINUX内核中min和max宏的学习
add linux kernel min, max define:
include/linux/kernel.h
/*
* min()/max() macros that also do
* strict type-checking.. See the
* "unnecessary" pointer comparison.
*/
#define min(x,y) \
(__extension__\
({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; }) \
)
#define max(x,y) \
(__extension__\
({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x > _y ? _x : _y; }) \
)
如上是include/linux/kernel.h中关于min和max两个很常用的宏的定义,在其中我们可以看到以下几个关键点:
1. 为何不用更简单的(x>y)?x:y 这样的方式来定义,而要重新赋值一次。
2. 为何要用({ })这样的结构包围代码块
3. 那个__extension__是什么东东? (有的版本没有这个__extension__)
4. (void)(&_x == &_y)有什么用,不是脱了裤子放屁么
解答:
1. 如果用户使用了min(x++,y++)会有怎样的结果?
所以最好的办法是避免在宏的实体里让参数出现一次以上。老的linux用的是 x>?y,这个>?操作符是返回x和y中较大的一个,不过GCC的文档里已经决定抛弃这种老的用法了。
2. GCC的扩展里像{ }这种结构也是可以有值的,其值就是其中最后一个语句的值(包括左值),这里外面再加个括号是为了保险,比如:
printf("猜猜会显示什么?\n答案是:%d\n",({
&
相关文档:
Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......
For all those who are beginners in any linux(ubuntu) find hard to find the package files of their distro and end up in finding an source package(which is either in tar.gz or .gz).. so now people think how to install these source files…..
lets now see how would you be installing source files ......
1. useradd 用户名
useradd命令负责添加用户到Linux系统(只有管理员可以使用这个命令)。
例:
useradd tom
2.userdel 用户名
userdel命令删除一个用户账户(只有管理员可以使用这个命令)。
例:
userdel tom
3.passwd 用户名
当创建一个用户之后需要为用户设置密码,passwd 可以完成此功能。当passwd后面没有参 ......
//获取子网掩码的函数QString GetLocalNetMask()
{
int sock_netmask;
char netmask_addr[50];
struct ifreq ifr_mask;
struct sockaddr_in *net_mask;
sock_netmask = socket( AF_INET, SOCK_STREAM, 0 );
if( sock_netmask == -1)
{
perror("create socket failture...GetLocalNetMask\n");
......
前一篇博客还写了自己写的端口转发工具,今天偶然在网上看到讲命名管道和netcat配合的用法,被彻底雷倒了。
原来以为netcat做不到,原来是自己想不到,而不是netcat做不到……
方法如下:
$ mknod backpipe p
&n ......