使用此命令时遇到问题
system("konsole --new-tab --workdir<dir here> -e perlprogram.pl &");
它打开 perlprogram.pl,其中有:
system("mpg321 song.mp3");
我想这样做是因为 mpg321 停止了主要的 perl 脚本。所以我想通过在另一个终端窗口中打开它就可以了。但是当我运行第一个脚本时,它所做的只是打开一个新选项卡并且什么都不做。
我是否正确使用了 konsole?
使用此命令时遇到问题
system("konsole --new-tab --workdir<dir here> -e perlprogram.pl &");
它打开 perlprogram.pl,其中有:
system("mpg321 song.mp3");
我想这样做是因为 mpg321 停止了主要的 perl 脚本。所以我想通过在另一个终端窗口中打开它就可以了。但是当我运行第一个脚本时,它所做的只是打开一个新选项卡并且什么都不做。
我是否正确使用了 konsole?
我使用
konsole
正确吗?
可能,没有。但这取决于。这个问题可以分解为两个问题:
konsole
.有多种方法可以做到这一点。以fork||exec('new-program')
、 tosystem 'new-program &'
或什至 开头open
。
system
将调用您操作系统的标准 shell,并执行您提供的命令。如果您提供多个参数,则不会进行 shell 转义,并exec
直接编辑指定的程序。(exec
到目前为止,该函数具有相同的接口)。system
返回一个数字,指定命令是否正确运行:
system("my-command", "arg1") == 0
or die "failed my-command: $?";
请参阅perlfunc -f system
有关此返回值含义的完整信息……</p>
如果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 的情况下运行)。
该程序的命令行界面很糟糕,当我使用任何参数运行它时,它会产生一半的错误。
但是,您的命令(加上一个工作目录)实际上应该可以工作。尾随 & 号不是必需的,因为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 保持标签打开,直到我关闭它。您可以保持选项卡打开,直到-e
通过--hold
. 这使您可以看到任何会消失的错误消息。