一个简单的 zsh 模块
source link: https://blog.lilydjwg.me/2015/7/26/a-simple-zsh-module.116403.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
一个简单的 zsh 模块
本文来自依云's Blog,转载请注明。
曾经,我让 Awesome 收养孤儿进程,以保持一个清晰的进程树。后来我又想让 zsh 也做这个 prctl 系统调用,免得子进程 fork 之后跑太远。比如 Wine 跑起来就好多个服务进程,如果不能把它们全部关掉的话,再启动另一个版本的 Wine 会出问题的。而当我启动好些个不同版本的 Wine 环境之后,只看到 Awesome 下边挂了一堆 Wine 的进程,却不知道哪些属于哪个 Wine 环境的了。
zsh 本身并不支持做这个调用,不过如同 Python 和 Lua 一样,zsh 也可以通过共享库来扩展功能。不同的是,zsh 模块是没有文档的……好在 zsh 源码里提供了一个 example 示例模块。把它改改就有了以下代码:
#include<sys/prctl.h> #include "subreap.mdh" #include "subreap.pro"
/**/ static int bin_subreap(char *nam, char **args, Options ops, UNUSED(int func)) { int reaping = !OPT_ISSET(ops, 'u'); int result = prctl(PR_SET_CHILD_SUBREAPER, reaping); return result; }
/* * boot_ is executed when the module is loaded. */
static struct builtin bintab[] = { BUILTIN("subreap", 0, bin_subreap, 0, -1, 0, "u", NULL), };
static struct features module_features = { bintab, sizeof(bintab)/sizeof(*bintab), 0 };
/**/ int setup_(UNUSED(Module m)) { return 0; }
/**/ int features_(Module m, char ***features) { *features = featuresarray(m, &module_features); return 0; }
/**/ int enables_(Module m, int **enables) { return handlefeatures(m, &module_features, enables); }
/**/ int boot_(Module m) { return 0; }
/**/ int cleanup_(Module m) { return setfeatureenables(m, &module_features, NULL); }
/**/ int finish_(UNUSED(Module m)) { return 0; }
name=zsh/subreap link=dynamic load=no
autofeatures="b:subreap"
objects="subreap.o"
把这两个文档保存到 zsh 源码目录的Src/Modules
下,可能还需要编辑一下config.modules
文件,然后编译就可得 subreap.so 文件。把这个文件放到/usr/lib/zsh/$ZSH_VERSION/zsh/subreap.so
然后就可以用了:
zmodload zsh
/subreap
subreap
模块加载之后,多了个subreap
内建命令。不带参数即调用prctl(PR_SET_CHILD_SUBREAPER, 1)
,这样不管其子进程怎么 fork,都会在此 zsh 的进程树之下。使用subreap -u
来取消这个设置。
如果你不想编译而又是 Linux 64 位系统,可以试试我编译好的版本:下载地址, 签名, SHA1: 09eb1cc9ebf6ec1e681641c0a60f57425cbb1e8c。
Recommend
-
57
I was quickly opening multiple shells for an unrelated project today and noticed how abysmal my shell load speed was. After the initial load it was relatively fast, but the actual shell start up was noticeably slow. I decided to time it with tim...
-
47
-
47
-
9
如何编写一个简单地内核模块 Linux给应用程序提供了丰富的api,但是有时候我们需要跟硬件交互,访问一些特权级信息,所以可以使用编写内核模块这种方式。另外Linux是宏内核结构,效率非常高,没有微内核那样各个模块之间...
-
5
本文对 zsh 补全系统进行了简单的介绍,然后分析了一个完整的示例,该示例可以作为一个新的补全脚本的起点。剩余内容对示例补全脚本进行了简要的分析和介绍。 zsh completion systemzsh completion system(compsys)是 zsh 的重...
-
6
在项目开发中遇到一个从服务器下载图片的需求。使用一些开源的库也能解决问题,但是对于这个简单的需求又有点重,因为项目对包大小的要求更高。 在四处浏览和自己努力下,最终写了一个可以满足以下需求的简单的工具类: 多线程下载 可...
-
10
配置一个简洁高效的 Zsh | Linux 中国事实上 oh-my-zsh 并不好用,严重拖慢了 Zsh 的速度,反而让你的工作并不高效。
-
13
使用 zsh 的 zpty 模块 本文来自依云's Blog,转载请注明。 Zsh 的模...
-
18
os.path 在python中也算是一个常用的模块,特别是和文件系统打交道时,涉及到文件、目录的操作经常会用到,你去看一些框架的源代码的时候也经常会使用到这些方法。 如果去看官方文档,os.path 大概提供了近20个方法,其实比较常用的方法我...
-
4
STM32中RFID模块(MFRC522)简单应用 - L*K - 博客园 此篇只是对RFID模块的简单概述以及应用,没有原理,对提供的店家提供的代码,...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK