AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 423919
Accepted
Anonymous
Anonymous
Asked: 2018-02-14 09:31:18 +0800 CST2018-02-14 09:31:18 +0800 CST 2018-02-14 09:31:18 +0800 CST

在我的应用程序中使用 gpm 作为鼠标输入从 mc(午夜指挥官)开始

  • 772

我使用 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 屏幕 - 简单有效!

linux tty
  • 1 1 个回答
  • 348 Views

1 个回答

  • Voted
  1. Best Answer
    Anonymous
    2018-02-15T02:59:16+08:002018-02-15T02:59:16+08:00

    我设法创建了一个简单的启动脚本,该脚本执行ps f以获取进程树。它给了我很好的输出,告诉我我需要的一切:

    PID TTY      STAT   TIME COMMAND
    281 tty1     Ss     0:00 -bash
    383 tty1     S+     0:00  \_ mc
    385 pts/0    Ss     0:00      \_ bash -rcfile .bashrc
    408 pts/0    R+     0:00          \_ ps f
    

    从最后一行解析它导致我使用真正的 TTY=tty1 进行处理(当然它是有罪的mc)。所以最后我可以使用已解析的 mc 的 tty 号码作为参数来执行我的程序。

    另一种选择是通过解析“/proc/PID/stat”文件来检索我的程序中的 tty 编号,例如ps包含 tty dev id 和父进程 id 的程序。但是使用脚本让我觉得它对操作系统的依赖性较小。下面的示例“/proc/PID/stat”:

    383 (mc) R 281 383 281 1025 383 ...
                |            |_ TTY:  test major bits for type and minor for id
                |______________ PPID: use to traverse tree 
    

    所以最后我想出了这段代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <gpm.h>
    
    static int find_tty()
    {
        char buf[256];
        char* ptr;
        FILE* f;
        int r;
        char stat;
        int ppid,pgrp,sess,tty;
    
        int pid = getpid();
    
        while (pid>0)
        {
            sprintf(buf,"/proc/%d/stat",pid);
            f = fopen(buf,"r");
            if (!f)
                return 0;
            r = fread(buf,1,255,f);
            fclose(f);
            if (r<=0)
                return 0;
            buf[r] = 0;
            ptr = strchr(buf,')');
            if (!ptr || !ptr[1])
                return 0;
            r = sscanf(ptr+2,"%c %d %d %d %d", &stat,&ppid,&pgrp,&sess,&tty);
            if (r!=5)
                return 0;
            if ( (tty&~63) == 1024 && (tty&63) )
                return tty&63;
            pid = ppid;
        }
        return 0;
    }
    
    int main(int argc, char* argv[])
    {
        Gpm_Connect gpm_connect;
        // ...
    
        int gpm = Gpm_Open(&gpm_connect,find_tty()/*0*/);
        // ...
    }
    
    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve