学校的网络位于无数重NAT内网中,而且还有各种VPN,所以想要从外网访问十分困难,之前试过各种方法都没成功。今天偶然看到了SSH反向穿透的方法,因为我访问内网服务器主要也是需要SSH连接功能,故此方法可以很好的满足我的需求。此处记录下配置方法。
学校的网络位于无数重NAT内网中,而且还有各种VPN,所以想要从外网访问十分困难,之前试过各种方法都没成功。今天偶然看到了SSH反向穿透的方法,因为我访问内网服务器主要也是需要SSH连接功能,故此方法可以很好的满足我的需求。此处记录下配置方法。
restrict
是C99标准中新增的关键词,只能用于修饰指针(函数指针除外),其含义为:此指针是访问其指向对象的唯一初始方法。使用此关键词的意义在于:有助于编译器进行代码优化。
min
和max
是两个很常用的操作,一般都是用宏实现的,不过想要写出一个很完善的宏定义还是要考虑很多问题的,本文就来分析下Linux Kernel中的实现方法。文中仅考虑min
,max
的结构与其完全相同,只要修改下大于小于号即可。
typeof
不是C语言本身的关键词或运算符(sizeof
是C标准定义的运算符),它是GCC的一个扩展,作用正如其字面意思,用某种已有东西(变量、函数等)的类型去定义新的变量类型。
从本质上看,C语言中的宏定义实现的是一个文本替换的功能,似乎很简单的样子,然而这几天去看了下Linux Kernel源码中的各种宏定义,才发现一个宏定义竟然也可以有如此多的奇技淫巧……于是花了一天时间仔细研究了下宏的相关知识,此处整理总结下。
字符串字面量(string literal)就是程序代码中出现的"
包围的字符串,比如"hello"
, "I Love C Language!"
这类的。在C语言中,有一个奇技淫巧:两个相邻的字符串字面量会自动被合并连接为一个。这里的相邻可以是直接连在一起,也可以是间隔着若干个空白字符。需要指出的是,这个特性是C语言标准所要求的,并不是某个编译器的扩展功能。
一个例子:
1 | printf("Hello" " World""!" "\n"); |
以上代码完全等同于:
1 | printf("Hello World!\n"); |
前几天去Intel面试时,遇到了一个问题:printf("%s", s)
与printf(s)
有何区别?面试官还提示我从安全的角度回答这个问题,然而当时并没有想出答案来……:( 回来后仔细研究了下这个问题,才发现pritnf(s)
这种写法是存在严重安全漏洞的,这被称为printf格式化字符串漏洞攻击。
正如在之前的文章中提到,Atom在Win10下若不禁用GPU加速的话,界面字体会模糊,启动时可以通过附加--disable-gpu
选项来禁用GPU,然而在打开关联文件等时候,是无法直接设置命令行参数的,此时就需要做些配置来实现这一目的。