0%
Placement New Conditionally Zeros out Memory
之前公司在把项目使用的gcc
版本从5.4
升级到7.5
,迁移的过程中发现了一个存在了很久的访问未初始化成员导致 segfault 的问题。但奇怪的问题是使用旧版本gcc
来编译时从来没有触发过 segfault,经过一番调试后发现各大主流编译器都会在placement new
调用对象的构造函数之前插入清零目的内存的指令,这导致之前使用gcc 5.4
编译时那个未初始化的成员在实际上被置零了,而在切换到gcc 7.5
之后同样的编译选项编译器不再在placement new
之前插入内存清零动作,从而导致了 segfault。
odhcpd 中继模式原理、局限以及解决方案
近日我学校终于开始试运行 IPv6 了,而我在配置路由器的过程中发现了一些由于上游配置不规范导致的各种问题(如下游客户端可获取 v6 地址但无法 ping 通外网等),于是就有了本文,希望能够普及相关知识以及帮助遇到类似问题的人。
本文主要针对常见的高校 IPv6 配置,即连入校园网、认证(可选)后路由器仅能获得一个 /64 地址,无 PD 获取。
How to Setup Clash Premium on Linux
UPDATE!!!
自 2022/04/10 日起 clash premium 更新了 linux 平台的auto-route
,因此可直接在配置文件中配置的tun
字段的auto-route
即可:
1 | tun: |
Custom NAT Gateway and DNS for VMware Fusion
由于电脑使用了 Surge 并开启了 Enhanced Mode 来做全局透明代理,现在希望 VMware Fusion 的虚拟机也自动使用这个代理。其实打开 Enhanced Mode 之后无需配置虚拟机即可直接享受透明代理的。但是这样在 Surge Dashboard 中看到的所有连接都是来源于 vmnet-natd
这个进程,十分不方便监控。
为此,可以手动在虚拟机中修改网关和 DNS 服务器来使 Surge 能够分辨出流量来自哪台虚拟机。但这在我的场景下还是有点麻烦,因为需要不停的重装虚拟机等操作,每一次都需要重新配置。本文将介绍如何修改 VMware Fusion 的 vmnet-dhcpd
配置文件来使虚拟机自动获取自定义的网关和 DNS 服务器。
How to Obtain a Moss Account
这学期在做助教的时候需要做代码查重,于是找到了斯坦福提供的 Moss 来做。根据官网的指示,我们需要向 [email protected]
发送一封特定格式的邮件来获取一个账号:
1 | registeruser |
然而我使用 macOS 自带的 Mail.app 发送却发现一直不能收到注册账号的回信。类似这种发送邮件自动注册的机制一般出现在各种 Mailing List 中,比如 Linux Kernel 的 Mailing List 就使用了 Majordomo 来管理订阅等服务。这些系统需要发送特定格式的纯文本邮件,不可以携带额外的格式信息才能够正常工作。
而收不到 Moss 的邮件也是这个原因,在输入 [email protected]
后,Mail.app 自作聪明地为它加上了超链接,即使在配置中设置了默认 Plain Text 模式也不起作用,这导致对方不能正确地解析这个邮件地址。
Install Wireless Drivers on Windows Server
最近在 Windows Server 2019 环境安装 Intel Wireless 8260 无线网卡的驱动时遇到了下面的错误:
1 | A service installation section in this inf is invalid. |
折腾了半天我发现 Windows Server 默认是禁止多媒体的相关服务的,这让我联想到无线相关的服务是不是也默认禁止或者根本没有安装?于是我打开 Powershell 并执行以下命令安装无线网相关服务:
1 | Add-WindowsFeature -Name Wireless-Networking |
执行好后重启系统再次尝试安装网卡驱动,这次终于安装成功了。
Locking in Linux Kernel
spinlock 和 mutex 是在 linux kernel 中广泛地使用地两种锁,这两种锁可以覆盖内核中大部分同步需求。
spinlock 即简单地自旋锁,如果暂时获取不到锁,则会一直重试(忙等待);而 mutex 则在获取不到锁地时候主动放弃 CPU(进行 sleep)。虽然 spinlock 很简单,但是其上锁/解锁地接口就有 spin_lock_lock/unlock
, spin_lock_irq/unlock_irq
, spin_lock_bh/unlock_bh
, spin_lock_irqsave/unlock_irqrestore
等,本文即试图总结应该如何正确地选择这些接口。如果读者对 kernel 中四种上下文还不熟悉,可以参考这篇文章。
Force grep Line Buffered
有时候我们需要在 shell 中执行类似 some-cmd | grep keyword | tee filtered.log
的命令,如果管道的起始命令输出的东西不够多,那么 grep
会攒够一定长度的输出才进行 flush 操作。这个行为会导致若提前使用 ^C
来结束管道,则会丢失很大一部分本应过滤出来的内容。
一个麻烦但是可行的解决方法是只结束管道的起点进程,如找到上述的 some-cmd
进程的 pid 并用 kill
发送 TERM
或其他信号使之退出,这样后面的 grep
在检测到输入流被关闭后会进行 flush 操作,将缓冲区的数据刷新到标准输出。
实际上 grep
提供了一个参数来设置它的输出流缓冲模式,即 --line-buffered
,该选项会将输出流设置成行缓冲,这在我们处理日志时十分有用,因为管道的源头一般是按行为单位产生日志的,这样如果 grep
也是行缓冲则在使用 ^C
结束整个管道时也并不会丢失内容。这样上述的命令就变成了这样:
1 | some-cmd | grep --line-buffered | tee filtered.log |
需要注意的是,如果管道中有多个 grep
命令,那么它们都需要设置该参数来确保每一行都会被 flush 到输出流;可以设置一个 shell alias 来简化该操作。这种方法的缺点是降低了 grep
的吞吐量,不过在大部分的调试场景应该是够用的了。