是否可以使用一个控制多个终端的unix进程?

时间:2014-01-28 21:20:22

标签: unix terminal ncurses

因此,通常我熟悉的模型是,如果您希望某种方式让不同终端上的多个用户与同一进程进行交互,您可以编写与单个服务器进程交互的客户端程序。

我的问题是:每个客户端是否可能/合理地以某种方式直接附加到该单个进程而不必编写客户端/服务器程序?我的目标是避免在套接字层上进行序列化的复杂性,并让所有终端使用内存中的共享数据结构进行通信。

我猜这会非常棘手,在unix下也许是不可能的,但我想听听是否有人做过或看到过这样的事情,以及要求可能是什么,以及是否这种方法的其他缺点超过了序列化复杂性的降低。

3 个答案:

答案 0 :(得分:1)

终端模拟器已经是客户端。只需打开tty文件。

实施例

$ gnome-terminal --tab-with-profile=main --command="env sleep 1d" --tab-with-profile=main --command="env sleep 1d"
$ ps --ppid $PPID -ly
S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S  1000  2151  2082  0  80   0  5208  2200 wait   pts/1    00:00:02 bash
...
S  1000  4500  2082  0  80   0   284  1051 hrtime pts/8    00:00:00 sleep
S  1000  4501  2082  0  80   0   280  1051 hrtime pts/9    00:00:00 sleep
$ echo -e 'tab1: \e[31mWorking!\e[39m' > /dev/pts/8
$ echo -e 'tab2: \e[31mWorking!\e[39m' > /dev/pts/9

答案 1 :(得分:0)

我会颠倒观点:“对于每个客户端以某种方式直接附加到该单个进程”在unix(而不仅仅是)中是一种废话。即使您不想使用套接字,您仍然可以编写一个“客户端”程序来附加到服务器发布的共享内存对象,或命名管道,甚至普通文件。用于与服务器通信的介质可能会有所不同,但一般来说,unix'架构鼓励将“服务器”功能分配给单独的进程(或更多)。因此,您可能正在寻找的是一种“轻量级”进程间通信,对等方之间很少或没有仲裁。如果数据完整性不是问题,您可以使用服务器公开的共享内存块,其中所有客户端(是的,您必须编写“客户端”程序)可以附加到读取数据作为普通块记忆。 如果您需要某种数据完整性,或者客户端有时还需要向共享内存写入内容,则可以使用信号量或互斥量来同步对共享块内数据结构的访问。这个解决方案有许多缺点,只有当“共享数据库”不经常更改,或者数据完整性不是必需的时候,或者由于互斥锁/信号量导致的开销是可接受的时候才有意义。

为了完整起见,我将告诉我们如何习惯在串口终端的旧时代:当时,服务器进程本身直接处理了许多终端。这是打开终端线(一个或多个/ dev / ttyXXX设备),配置它们并具有“主循环”的问题,其中每个通道(即文件描述符)由“选择”系统调用或类似程序监听。当然,终端被锁定到特定的应用程序,用户只能做应用程序让他/她做的事情。

编辑:避免编写客户端程序的常用方法是使服务器在tcp端口上实现简单的基于文本的,面向行的协议。客户端是...... telnet!当然,这是一个非常粗鲁的解决方案,但在许多情况下(例如调试,维护......)就足够了。

答案 2 :(得分:0)

你自己找到了答案!您可以使用共享内存段来进行通信。 shm_open是POSIX共享段的一个很好的条目,您也可以使用shmget SYSV共享段,甚至是mmap共享内存映射。

当然会有一些棘手的部分,因为您需要明确定义共享结构的共享方式。通常使用某种信号量或类似的东西来同步对结构的访问。并且可能不会让您免于定义一种协议/序列化的需要......