微信,QQ,飞书,钉钉等常用社交软件电脑版默认会把Enter设置为“发送”快捷键,我是很反对的。

上个月有同事在群里问如何获取一个转瞬即逝的进程的全路径,显然查/proc/$pid/cmdline的话怕是手速不够快,由于迄至5.x版本的Linux内核API已经足够丰富,以至于已经天然支持了获取全路径的API,即 get_cmdline

我快速在我自己的虚拟机里进行尝试:

#!/usr/bin/stap -g

%{
#include <linux/skbuff.h>
#include <linux/tcp.h>
#include <linux/mm.h>
#include <net/tcp.h>

int (*ptr)(struct task_struct *task, char *buffer, int buflen);
%}

function dump(skk:long)
%{
	struct sock *sk = (struct sock *)STAP_ARG_skk;
	struct tcp_sock *tp = tcp_sk(sk);
	struct inet_sock *inet = inet_sk(sk);
	struct task_struct *curr = current;
	char buf[128];

	ptr = (void *)0xffffffffb6802d90;

	if (ntohs(inet->inet_dport)  == 80) {
		ptr(curr, buf, 128);
		STAP_PRINTF("%s %s  %d\n", curr->comm, buf, curr->pid);
	}
%}

probe kernel.function("tcp_connect")
{
	dump($sk);
}

其中0xffffffffb6802d90这个地址是我在/proc/kallsyms里查到的。

上面的脚本完美打印出了全路径,我迫不及待得将这个发到群里,希望能够提供帮助。于是我复制粘贴了上面的脚本,一个Enter拍下去就发出了,后面我紧接着准备发送一句提示:

0xffffffffb6802d90这个地址你自己从/proc/kallsyms里找,就是get_cmdline的地址。cat /proc/kallsyms |grep get_cmdline 获取。

然而还没等我这句话发出,上面脚本已经被执行,机器已经panic了…这一切都怪Enter键。

换句话说, Enter键作为发送快捷键让人们聊天的内容大部分都不再具有原子性。 为了用Enter发送消息,有时候发送多段消息又怕不小心敲下Enter的时候,你不得不做类似的事情:

请注意,我下面的消息可能会分段发出,只有看到“发完了”的时候,才表示我发完了。。。或者就是如果我还没有发完,我就必须在每条消息后,Enter键拍下前加一句“我还没说完”。。。

而Enter键是很容易误碰的。对于程序员而言,除了空格之外的第二吧。

将Enter键作为默认的发送快捷键只能让消息发送更快更便捷,却很容易带来误解,有时候你话说一半就不小心发出去了。

这种问题在音视频通信中很常见,比如打电话,句子是一句一句断句的,你总不能每次都加一句我还没说完吧。所以一般重要场合,音频通话是要加锁的,比如一些军事行动,说话必须听到“完毕”才能整体理解,否则就接着听。

最后给一个有用的代码,获取绝对路径最简单的方法:

// curr 就是 current ,也就是一个task_struct
name = kstrdup_quotable_file(curr->mm->exe_file, GFP_KERNEL);

浙江温州皮鞋湿,下雨进水不会胖。

Logo

更多推荐