gpt4 book ai didi

c - 在开始时停止子进程

转载 作者:太空狗 更新时间:2023-10-29 11:23:04 25 4
gpt4 key购买 nike

我正在尝试实现检查点功能来检查进程。我通过 fork 一个子进程来做到这一点。但是我需要在开始时暂停子进程。稍后,我们可以通过取消暂停子进程并让父进程自行终止来从检查点重新启动。

这是我为 checkpointrestart_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 的参数,在开始时停止 fork 进程,然后使用 PTRACE_CONT 启动。不幸的是,PTRACE_TRACEME 仅在 exec 函数调用时停止。

最佳答案

您可以使用 IPC 信号量或 SIGNAL USR1...

关于c - 在开始时停止子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6707454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com