【问题标题】:Using konsole to emulate a terminal through Perl使用 konsole 通过 Perl 模拟终端
【发布时间】:2013-02-04 20:35:28
【问题描述】:

我在使用这个命令时遇到了问题

system("konsole --new-tab --workdir<dir here> -e perlprogram.pl &");

它会打开 perlprogram.pl,其中有:

system("mpg321 song.mp3");

我想这样做是因为 mpg321 停止了主要的 perl 脚本。所以我想通过在另一个终端窗口中打开它就可以了。但是当我运行第一个脚本时,它所做的只是打开一个新选项卡并且什么都不做。

我是否正确使用了 konsole?

【问题讨论】:

    标签: linux perl raspberry-pi konsole


    【解决方案1】:

    我是否正确使用konsole

    可能,不会。但这取决于。这个问题可以分解为两个问题:

    1. 如何实现并发,让我的程序在执行外部命令时不会停止
    2. 如何使用konsole

    1。并发

    有多种方法可以做到这一点。从fork||exec('new-program') 开始,到system 'new-program &amp;',甚至open

    system 将调用您操作系统的标准 shell,并执行您提供的命令。如果提供多个​​参数,则不进行shell转义,直接指定程序execed。 (到目前为止,exec 函数具有相同的接口)。 system 返回一个数字,指定命令是否正确运行:

    system("my-command", "arg1") == 0
      or die "failed my-command: $?";
    

    请参阅perlfunc -f system 了解有关此返回值含义的完整信息……

    如果成功,exec 永远不会返回,而是将您的进程转变为执行新程序。

    fork 将您的进程一分为二,并将子进程和进程作为相等的副本执行。它们只是fork的返回值上有所不同:父母得到了孩子的PID;孩子得了零。所以下面异步执行一个命令,让你的主脚本执行没有进一步的延迟。

    my @command = ("mpg321", "song.mp3");
    fork or do {
      # here we are in the child
      local $SIG{CHLD} = 'IGNORE'; # don't pester us with zombies
      # set up environment, especially: silence the child. Skip if program is well-behaved.
      open STDIN, "<", "/dev/null" or die "Can't redirect STDIN";
      open STDOUT, ">", "/dev/null" or die "Can't redirect STDOUT";
      exec {$command[0]} @command;
      # won't ever be executed on success
      die qq[Couldn't execute "@command"];
    };
    

    上述进程有效地守护子进程(在没有 tty 的情况下运行)。

    2。控制台

    该程序的命令行界面很糟糕,当我使用任何参数运行它时,它会产生一半的错误。

    但是,您的命令(加上一个工作目录)实际上应该可以工作。尾随 & 号不是必需的,因为 konsole 命令会立即返回。类似的东西

    # because I `say` hello, I can be certain that this actually does something.
    konsole --workdir ~/wherever/ --new-tab -e perl -E 'say "hello"; <>'
    

    对我来说很好(打开一个新标签,显示“你好”,并在我按 Enter 时关闭)。最后的 readline 保持标签打开,直到我关闭它。您可以在通过--hold 执行-e 命令之前保持选项卡打开。这使您可以看到任何会消失的错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      相关资源
      最近更新 更多