だから私は自分のシェルを構築しています。機能の1つは、バックグラウンドで実行されているすべてのジョブ、それらの名前、PID、bashに似たジョブ番号、つまり中断または実行中のステータスをリストすることです。終了したばかりのバックグラウンド ジョブの終了ステータス コードも出力する必要があります。今、バックグラウンドで実行されているときに、これを行うシステムコールまたはC APIコールがあるかどうか、または私が言及したことを行う独自のジョブ関数を作成する必要があるかどうか疑問に思っていましたか? ありがとう。Linuxを使用してCでこれを行っています。
2 に答える
/proc
実行中のすべてのプロセスには、名前と状態の詳細とともに、その PID に等しいディレクトリがここにあるため、すばやく簡単な方法は検索することです。そのためには、通常の stdio 関数を使用できます。
psmiscソース コードには、 とのインターフェイス用に設計された一連の標準 Linux ユーティリティが含まれているため、参照することをお勧めします/proc
。
具体的なタスク (シェルのようなジョブ制御) については、そのような関数を自分で作成する必要があります。ところで、ほとんどの情報はすでに持っていて、とにかく手元に置いておく必要があります。
子の PID は、waitpid(2) のために保持する必要があります。
プロセスが argv[0] を変更する可能性があるため、子プロセスの開始に使用されるコマンド ラインを保持する必要があります。したがって、元の行は失われます。
ジョブ番号はシェルにとって純粋に内部的なものであり、OS はそれを気にしません (つまり、ジョブ番号を気にしなければ、誰も気にしません)。ご覧のとおり、あなた (つまり、あなたのプロセス) だけが必要な情報を持っています。
もう 1 つの理由は、携帯性です。Linux の procfs (/proc) からの情報で十分であると仮定しても、FreeBSD ではこれらすべてがまったく異なる問題です。kvm(3) インターフェースを介して作業する必要があります。Mac OS X では、3 番目の方法が必要になります。procfs はなく、kvm(3) はしばらく前に廃止されました。
結論: システムの違いを回避することはできますが、情報の一部しか得られません。別の手から、とにかくその情報があなたのプロセスに浮かんでいる、または持っているべきです。使用するだけで、はるかにシンプルになり、移植性が大幅に向上します。