1

私の C++ プログラムでは、プログラムを待たずにバックグラウンドで実行しようとしています。

ただし、Linux では、次のようにバックグラウンドで vi を起動するとvi &、vi が表示されません。私のプログラムでは、vi が終了するのを待たなくても vi がポップアップします。

つまり、バックグラウンドで実際に実行していないということですか? これはどのように修正できますか?

fgまた、Linux でvi を前面に出すように入力すると、vi が表示されることに気付きました。c++ でこれを行うにはどうすればよいですか?

4

1 に答える 1

5

ここで行われていることはかなり複雑です (必要以上の情報については、glibc のマニュアルのジョブ制御に関するセクションを参照してください)。簡単に説明すると、フォアグラウンド プロセス グループのみが端末にアクセスできます。端末にアクセスしようとすると、他のプロセスは^Zカーネルによって自動的に取得されます。

C からプロセスをフォークする場合、親がフォアグラウンド プロセス グループにある場合、親または子のいずれかがそれを変更しない限り、子もフォアグラウンド プロセス グループにあると見なされます。を実行するvi &と、シェル (これは単なる別の C プログラムです。覚えておいてください) はvi、フォアグラウンド プロセス グループから取り出します。しかし、あなたはそれをしていないので、viすぐに実行されます。

&ここで、C プログラムからプロセスを forkし、シェルから実行された場合と同じように処理する必要があります。その一部しかできません。非フォアグラウンド プロセス グループに配置できます。手順については、glibc のマニュアルを参照してください。先ほど言ったように、これは複雑ですが、シェルのジョブ制御コマンドが認識しているプロセス グループのリストに追加することはできません。そのリストはシェル内部の状態であり、別のプロセスから取得する方法はありません。

于 2011-05-04T03:38:21.550 に答える