使用konsole通过Perl模拟终端

时间:2013-02-04 20:35:29

标签: linux perl raspberry-pi konsole

使用此命令时出现问题

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

打开perlprogram.pl,其中包含:

system("mpg321 song.mp3");

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

我是否正确使用konsole?

1 个答案:

答案 0 :(得分:1)

  

我正确使用konsole吗?

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

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

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

    system将调用操作系统的标准shell,并执行您提供的命令。如果提供多个​​参数,则不会执行shell转义,并且直接指定程序exec。 (到目前为止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

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

    但是,您的命令(加上工作目录)应该可以正常工作。尾随&符号不是必需的,因为konsole命令立即返回。像

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

    对我来说很好(打开一个新标签,显示“你好”,当我按下回车时关闭)。最后的readline保持标签打开,直到我关闭它。您可以在通过-e执行--hold命令之后保持选项卡处于打开状态。这允许您查看否则会消失的任何错误消息。