我使用 libgpm 来读取控制台应用程序中的鼠标事件。如果直接从 shell 启动,它工作正常。如果从 mc(午夜指挥官)启动,它不会收到任何鼠标事件。
问题与 mc 为我的进程创建的伪终端有关。我可以通过强制 gpm 使用作为第二个参数传递给 Gpm_Open 的指定控制台屏幕来半解决这个问题(而不是 0 - auto?)。
int Gpm_Open(Gpm_Connect*,int);
有什么方法可以知道在伪 tty(由 mc 创建)上运行时应该使用哪个虚拟控制台屏幕?我考虑过使用活动控制台,但它可能不是我的应用程序正在运行的控制台。可能遍历进程树并检查它的 TTY 是否是一个真正的控制台会起作用,但我不知道如何为给定的 pid 获取 tty(name),我担心我需要提升权限。
或者希望有更简单的解决方法吗?
编辑:我刚刚注意到从 mc 开始我的进程但通过 sudo (使用命令行)而不强制 gpm 使用特定的 vc 屏幕 - 简单有效!
我设法创建了一个简单的启动脚本,该脚本执行
ps f
以获取进程树。它给了我很好的输出,告诉我我需要的一切:从最后一行解析它导致我使用真正的 TTY=tty1 进行处理(当然它是有罪的
mc
)。所以最后我可以使用已解析的 mc 的 tty 号码作为参数来执行我的程序。另一种选择是通过解析“/proc/PID/stat”文件来检索我的程序中的 tty 编号,例如
ps
包含 tty dev id 和父进程 id 的程序。但是使用脚本让我觉得它对操作系统的依赖性较小。下面的示例“/proc/PID/stat”:所以最后我想出了这段代码: