プロセスをチェックポイントするチェックポイント機能を実装しようとしています。子プロセスをフォークすることでそれを行います。ただし、開始時に子プロセスを一時停止する必要があります。後で、子プロセスの一時停止を解除し、親プロセス自体を強制終了させることで、チェックポイントから再開できます。
これが私が書いたコードとcheckpoint
、restart_from_checkpoint
それらを呼び出す方法の例です。
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
pid_t checkpoint();
void restart_from_checkpoint( pid_t pid );
int main( int argc, char *argv[] )
{
int i;
pid_t child_pid;
pid_t parent_pid = getpid();
for( i = 0; i < 10; i++ )
{
if ( i == 4 )
{
printf( "%6s: Checkpointing!\n", (getpid() == parent_pid)? "parent":"child" );
child_pid = checkpoint();
}
if ( i == 7 )
{
printf( "%6s: Restarting!\n", (getpid() == parent_pid)? "parent":"child" );
restart_from_checkpoint( child_pid );
}
printf( "%6s: i = %d\n", (getpid() == parent_pid)? "parent":"child", i );
}
return 0;
}
pid_t checkpoint()
{
pid_t pid;
int wait_val;
switch (pid=fork())
{
case -1:
perror("fork");
break;
case 0: // child process starts
ptrace(PTRACE_TRACEME,0,0,0);
raise( SIGTRAP ); // Note that this is the solution to first part
// of the question, which I added after
// asking this question.
break; // child process ends
default: // parent process starts
wait(&wait_val);
return pid;
}
}
void restart_from_checkpoint( pid_t pid )
{
ptrace(PTRACE_CONT, pid, NULL, NULL);
wait(NULL); // I'm just waiting here, but actually
// I need to kill the calling process.
}
を呼び出した後に子プロセスを停止する方法がわかりませんptrace(PTRACE_TRACEME,0,0,0)
。第二に、子プロセスを継続させながら親プロセスを強制終了する方法がわかりませんrestart_from_checkpoint
。
ptrace
最良の方法は、フォークされたプロセスを最初に停止し、後で で開始するパラメータを使用する可能性ですPTRACE_CONT
。残念ながら、PTRACE_TRACEME はexec
関数呼び出しでしか停止しません。