【问题标题】:spawning a new terminal and writing to its stdout生成一个新终端并写入其标准输出
【发布时间】:2014-08-22 17:54:36
【问题描述】:

我有一个应用程序,它使用 gui 来完成与用户的大部分交互。但是我想有一个单独的终端窗口,我可以写入它以进行一些错误检查、原始值等。

我知道我可以使用system() 命令生成一个新终端,但我不知道是否可以进行交互。

在最好的情况下,我希望有一个函数,它接受一个字符串(我知道的 char 数组...),并将其打印到新生成的控制台窗口:

类似:

int func(char *msg) {
    static // initiate some static interface with a newly spawned terminal window.

    // check if interface is still valid

    // send data to terminal

    return 0; //succes

}

【问题讨论】:

  • 看看ncurses
  • 我知道 ncurses,但据我所知,ncurses 不允许我生成新的终端窗口,只能控制当前打开的窗口。我之前在几个应用程序中使用过 ncurses。

标签: c terminal


【解决方案1】:

好吧,假设终端您的主要输出设备(例如 tty[n]),那么如何打开“新”终端?

您可以在图形 DE 中打开多个终端的唯一原因是因为它们是终端模拟器。您需要启动另一个终端仿真器并使用套接字或共享内存之类的东西写入其标准输出。

【讨论】:

  • tl;dr : 没有标准方法
  • 那种糟透了.../dev/pts 包含所有虚拟终端,但有没有办法可以识别或“命名”新生成的终端? pts 将允许我生成一个新终端,但没有记录将其链接到终端仿真器
  • 只需打开一个套接字并将您的命令和其他命令发送到另一个终端,那么您所需要的只是相同的端口号。如果您不想这样做,您可以使用共享文件或共享内存(shm 方法会更快),但这是一个巨大的安全风险;如果从您的角度来看这很重要
  • posix_openpt() 后跟 unlockpt() 然后使用 ptsname() 获取名称 (/dev/pts/x)
【解决方案2】:
  1. 打开管道。
  2. 叉子。
  3. 在子进程中,关闭写端和exec到一个运行cat /dev/fd/<rdfd>xterm
  4. 在父进程中,关闭读端,写到写端。
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <unistd.h>

int main(int argc, char **argv) {
    (void)argc, (void)argv;

    int fds[2];
    if(pipe(fds) == -1) {
        abort();
    }

    int child_pid = fork();
    if(child_pid == -1) {
        abort();
    }

    if(child_pid == 0) {
        close(fds[1]);
        char f[PATH_MAX + 1];
        sprintf(f, "/dev/fd/%d", fds[0]);
        execlp("xterm", "xterm", "-e", "cat", f, NULL);
        abort();
    }

    close(fds[0]);
    write(fds[1], "Hi there!\n", sizeof("Hi there!\n"));
    sleep(10);
    close(fds[1]);
    sleep(3);

    return EXIT_SUCCESS;
}

您可以使用fdopenfds[1] 转换为FILE *,您可以使用fprintf 等等。

【讨论】:

  • 我喜欢这种方法,分叉和使用 pid 可能比单独打开另一个进程并通过套接字发送命令要容易得多。
  • 谢谢。有用!尽管我有点不喜欢fork()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多