URL: https://linuxfr.org/users/yazgoo/journaux/diss-gestionnaire-de-session-terminal-en-rust Title: diss, gestionnaire de session terminal en rust Authors: yazgoo Date: 2022年10月27日T23:56:53+02:00 License: CC By-SA Tags: multisessions, rust et terminal Score: 25 Cher journal, c'est derniers temps j'ai travaillé sur un petit projet en rust, diss. [Site du projet (github)](https://github.com/yazgoo/diss/) ![](https://github.com/yazgoo/diss/raw/main/doc/diss-logo-small.png) Diss est un programme (ainsi qu'une crate rust) qui permet de détacher une session d'un terminal, comme dtach et abduco (un peu comme screen ou tmux mais sans le multiplexing de terminal). L'idée, tout comme abduco, est d'avoir un programme simple pour détacher d'autres programmes, et de les combiner avec d'autres outils pour faire du multiplexing. Ici on est en rust donc plus safe d'un point de vue mémoire que le C d'abduco (3 `unsafe` utilisés que j'espère enlever petit à petit). ## utilisation en terme d'interface, diss est très proche d'abduco: Pour lancer une nouvelle session (par exemple la commande `vim hello` ici): ```bash $ diss -e g -a session-name vim hello ``` - `-e g` indique que pour détache la session il faut faire `CTRL+G` - `-a session-name` indique le nom de session on peut connecter plusieurs terminaux à la même session en faisant ```bash $ diss -e g -a session-name ``` On peut aussi tout à fait utiliser diss comme une crate (lib) ```rust let command = vec![ "nvim".to_string(), "hello".to_string(), ]; diss::run("session-name".to_string(), &command, env_vars, Some("g".into()))?; ``` ## Fonctionnement ![diagramme](https://github.com/yazgoo/diss/raw/main/doc/diss-diag.png) Lorsque l'on démarre une nouvelle session, diss fork et lance un server, qui va: 1. créer et écouter une socket unix (dans `~/.config/diss/`) 1. daemonizer le server (e.g. changer le parent du process pour que ne soit plus le terminal mais à la place init) 1. forker: 1. le process enfant lance le programme que l'on veut utiliser 1. le parent lance un thread pour écouter la sortie de l'enfant Ensuite, diss lance le client qui se: 1. connecte au server via la socket unix 1. envoie la taille du terminal 1. envoie une demande de flush du terminal 1. lance un thread ou il capture les événements (touche, redimensionnement, clear) et les envoie aux server 1. reçoit les octets du server et les affiche Quand un client se connecte, le server: 1. ajoute le stream unix au thread d'écoute des événements du process forké 1. crée un nouveau thread pour transférer les événements du client au process forké. ## futur J'utilise cette crate au quotidien, ce qui me permet de réparer les bugs petit à petit. Je suis en train de l'intégrer à mon [plugin vim (vmux)](https://github.com/yazgoo/vmux/pull/13), (c'est d'ailleurs pour ce projet que j'ai créé diss), mais c'est une histoire pour un autre journal.

AltStyle によって変換されたページ (->オリジナル) /