1

このコマンドを使用すると問題が発生します

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

次のようなperlprogram.plを開きます。

system("mpg321 song.mp3");

mpg321がメインのperlスクリプトをストールさせるので、これを実行したいと思います。だから、別のターミナルウィンドウで開いて大丈夫だと思いました。しかし、最初のスクリプトを実行すると、新しいタブを開いて何もしません。

konsoleを正しく使用していますか?

4

1 に答える 1

1

私はkonsole正しく使用していますか?

おそらく、いいえ。しかし、それは状況によります。この質問は、次の 2 つの問題に分解できます。

  1. 外部コマンドの実行中にプログラムが停止しないように、同時実行を実現するにはどうすればよいですか
  2. の使い方konsole

1. 並行性

それには複数の方法があります。fork||exec('new-program')、 からsystem 'new-program &'、または で始まりopenます。

systemOS の標準シェルを起動し、指定したコマンドを実行します。複数の引数を指定すると、シェルのエスケープは行われず、指定されたプログラムがexec直接実行されます。(exec関数はこれまでと同じインターフェースを持っています)。systemコマンドが正しく実行されたかどうかを示す数値を返します。

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

この戻り値が何を意味するかについての完全な情報については、を参照してくださいperlfunc -f system…</p>

成功したexec場合は戻りませんが、プロセスを新しいプログラムの実行に変換します。

forkプロセスを 2 つに分割し、子プロセスとプロセスを同等のコピーとして実行します。の戻り値のみが異なります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は、タブを閉じるまでタブを開いたままにします。-e経由でコマンドを実行するまで、タブを開いたままにしておくことができます--hold。これにより、他の方法では消えてしまうエラー メッセージを確認できます。

于 2013-02-04T22:28:30.600 に答える