gpt4 book ai didi

c: 在子进程中运行的 exec() 中捕获一个段错误

转载 作者:行者123 更新时间:2023-12-04 00:58:35 25 4
gpt4 key购买 nike

编辑:

我正在尝试编写一个简单的smoketest,其中测试所有选项和合理的参数。

我使用 popen() 来执行应该测试的程序。
使用这种方法不起作用,因为如果进程因信号(SIGINT,SIGSEGV ...)而死,来自 popen() 的管道不会告诉我发生了什么。

编写信号处理程序并没有帮助,因为 popen 创建了一个接收信号但不是我的smoketest 的新进程。

感谢我使用 pipe()、fork() 和 execv() 来创建我自己的 popen() 版本的答案。

当程序现在出现段错误时,存在管道无用的问题(读取导致奇怪的行为 -> 阻止进程,直到我向父级发送 sigkill !)

为了避免这种情况,我尝试了不同的方法,我的解决方案如下(这很简单,但我花了一段时间才弄清楚)。所以这是我的示例代码:

static int child_dead = 0;

void sigaction_sigchld(int signal) { /* Child died */
child_dead = 1;
}

int main(int argc, char *argv[], char *env[])
{
char *crashing_program = "/program_path/and_name";
int ret;
int byte;

pid = fork();

if(pid == 0) /* Child */
{
execve(crashing_program, argv, env);

/* if execve returns that it mus have failed! */
fprintf(stderr, "Exec failed\n");
_exit(-1);
} else /* Parent */
{
if(!child_dead)
{
byte = read(pipe_out[1], line, BUFFSIZE);
if(!byte){
perror("Smoketest:Line:xxx");
} else
{
fprintf(stdout, line);
}
}
wait(&child_status);
/*
check if the child died with SIGSEGV etc
*/
}

只要我一次只有一个 child ,这对我来说就足够了,这似乎可以正常工作。我有人有更好的主意或任何提示我会很高兴更新此条目。

最后但同样重要的是:当然,使用这种方法可能无法进行任何清理。

干杯。

最佳答案

请参阅 waitpid(2) 的文档.您可以使用一堆宏来测试子进程是如何终止的。特别是,您可以使用 WIFSIGNALED()WTERMSIG()测试子进程是否被信号终止,如果是,哪个信号:

int status = pclose(...);
if (WIFSIGNALED(status))
{
// It was terminated by a signal
if (WTERMSIG(status) == SIGSEGV)
{
// It was terminated by a segfault
}
}

编辑:如评论中所述,您宁愿使用 fork 和 exec,然后使用 waitpid(2)正确更新状态。

关于c: 在子进程中运行的 exec() 中捕获一个段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7339664/

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