4

一个简单的 zsh 模块

 3 years ago
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.
neoserver,ios ssh client

一个简单的 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。

发送到 Kindle

Category: Linux | Tags: linux zsh C代码 | Read Count: 6765

评论 (1)
fc 说:
6 年前

喜歡收養孤兒的百合大大

[取消回复评论]

昵称 登录 E-mail: *
Web:
Twitter:
当有新评论通过 E-mail 通知我

loading captcha image...
(输入验证码)

or Ctrl+Enter


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
    • blog.richardweitech.cn 6 years ago
    • Cache

    Shell 中的极品-- Zsh - Richard Wei

  • 47
    • 微信 mp.weixin.qq.com 5 years ago
    • Cache

    oh-my-zsh: 让终端飞

  • 9

    如何编写一个简单地内核模块 Linux给应用程序提供了丰富的api,但是有时候我们需要跟硬件交互,访问一些特权级信息,所以可以使用编写内核模块这种方式。另外Linux是宏内核结构,效率非常高,没有微内核那样各个模块之间...

  • 5

    本文对 zsh 补全系统进行了简单的介绍,然后分析了一个完整的示例,该示例可以作为一个新的补全脚本的起点。剩余内容对示例补全脚本进行了简要的分析和介绍。 zsh completion systemzsh completion system(compsys)是 zsh 的重...

  • 6
    • blog.bihe0832.com 3 years ago
    • Cache

    Android简单实现的多线程下载模块

    在项目开发中遇到一个从服务器下载图片的需求。使用一些开源的库也能解决问题,但是对于这个简单的需求又有点重,因为项目对包大小的要求更高。 在四处浏览和自己努力下,最终写了一个可以满足以下需求的简单的工具类: 多线程下载 可...

  • 10
    • zhuanlan.zhihu.com 3 years ago
    • Cache

    配置一个简洁高效的 Zsh | Linux 中国

    配置一个简洁高效的 Zsh | Linux 中国事实上 oh-my-zsh 并不好用,严重拖慢了 Zsh 的速度,反而让你的工作并不高效。

  • 13
    • blog.lilydjwg.me 3 years ago
    • Cache

    使用 zsh 的 zpty 模块

    使用 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