プロセスをRAMにロードしますが、スケジューラにプロセスを実行しないように指示する方法はありますか?目的は、システムがディスクからバイナリファイルを読み取り、コードのRAMにページを割り当てますが、すぐにコードにジャンプして実行を開始しないようにすることです。後で再開する予定です。
以下はこれと似ていますが、信号を転送してプロセスを一時停止する前に一定量の操作を実行できます。
$ /path/to/program &; kill -STOP $!
コード実行の一部には、実際のプログラムの最初の行を実行する前にライブラリやその他の「設定」を取得することが含まれていると仮定します。このステップが実行されるかどうかは重要ではありません。私にはroot権限があり、これをサポートするためにシステムを変更できると仮定できます。
それで遊んだ後、gdb
私はこれがある点で私の要件を満たすことができると思いました。それだけで十分ですが、理想的には私のプロセスを実行せずにこれを行う方法があります。
コメントによれば、需要負荷の問題によって計画が実際にイライラすることが考えられます。コードをRAMにロードし、ファイルを修正し、プロセスを実行したいと思います。 RAMのコードはディスクのコードとは異なります。プロセスの最初の操作がファイルをハッシュすることであれば、「正しい」コードを実行しても「無効な」ハッシュ値が得られます。
答え1
これはあなたの目的に合わないかもしれません本物その後、(コメントで述べたように、必要に応じてバイナリがロードされますが)、プロセスが開始されるとすぐにプロセスを停止して待機状態にしますSIGCONT
。
次の内容をファイルに入れますstop.c
。たとえば、次のようになります。
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
__attribute__ ((constructor)) void stoponstart() {
kill(getpid(), SIGSTOP);
}
共有ライブラリでビルドします。
gcc stop.c -o stop.so -fPIC -shared
その後、プログラムを「起動して一時停止」したいときはいつでもあらかじめロードしてください。
LD_PRELOAD=/path/to/stop.so foo
シェルで実行すると、実際にプロセスがバックグラウンドに切り替わりますfg
。