/diss

dtach-like program / crate in rust

Primary LanguageRust

dissociate (verb):
1. (especially in abstract contexts) disconnect or separate.

Discord

What is diss ?

Diss:

  • dissociates a program from current terminal
  • is like dtach, abduco (think GNU screen or tmux without multiplexing)
  • is also a rust crate you can easily integrate

How do I use diss CLI ?

installing

  1. install cargo
  2. run cargo install diss

create session (or reatach if already exists), detach with CTRL+g

diss -e g -a session-name vim hello

attach to running session

diss -e g -a session-name

list running sessions

diss -l

projects based on diss

  • vmux, a vim terminal multiplexer

How does diss work ?

diagram

When you start a diss new diss session, diss will launch a server, which will:

  1. create and bind to a unix domain socket (located in ~/.config/diss)
  2. daemonize the process (so it is not a child of current terminal)
  3. fork with ptmx / ptms:
  4. in the child, launch the program you want to use with a pseudo terminal
  5. start a program event thread waiting for events from the child
  6. in the parent, will start waiting for connection from client

Diss will then start a client which will:

  1. connect to the server unix domain socket
  2. send terminal size to the server
  3. send a flush request to the server
  4. in a thread, take events from the terminal and forward them via the socket
  5. read server output as raw bytes and print them in the terminal

When a client connect, the server will:

  1. add the client unix stream to the program event thread
  2. create a new thread to receive events from the client and forward them to the child