gpt4 book ai didi

我们可以重置 sigsetjmp 以再次返回 "0"(重置 sigsetjmp)吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:27 30 4
gpt4 key购买 nike

我已经使用 sigsetjmp 和 siglongjmp 编写了一个段错误处理程序。一旦它进入信号处理程序,我就会调用 siglongjmp 以便跳过错误指令。

问题是,我再次想引起 SIGSEGV 并转到同一个处理程序,但现在 sigsetjmp 将返回 1。

如何重置sigsetjmp?

这是我的代码:

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#include <setjmp.h>

sigjmp_buf env, env1;

void SIGSEGV_handler(int signal)
{
printf("Segmentation fault caught\n");
siglongjmp(env, 1);
}

int main()
{
void * allocation;
size_t size;
static int devZerofd = -1;
struct sigaction sa, sa1;

sa.sa_handler=(void*)SIGSEGV_handler;
sigaction(SIGSEGV, &sa, NULL);

if ( devZerofd == -1 ) {
devZerofd = open("/dev/zero", O_RDWR);
if ( devZerofd < 0 )
perror("open() on /dev/zero failed");
}

allocation = (caddr_t) mmap(0, 5000, PROT_READ|PROT_NONE, MAP_PRIVATE, devZerofd, 0);

if ( allocation == (caddr_t)-1 )
fprintf(stderr, "mmap() failed ");

if ( mprotect((caddr_t)allocation, 5000, PROT_NONE) < 0 )
fprintf(stderr, "mprotect failed");
else
printf("mprotect done: memory allocated at address %u\n",allocation);

if(sigsetjmp(env, 1)==0) {
printf("Causing SIGSEGV: 1\n");
strcpy(allocation,"Hello, how are you");
}

/****** This can't be done again as sigsetjmp won't return 0*****/
/*

if(sigsetjmp(env, 1)==0) {
printf("Causing SIGSEGV: 1\n");
strcpy(allocation,"Hello, how are you");
}
*/
}

最佳答案

您误解了[sig]setjmp 的工作原理。如果您取消注释您认为行不通的代码,编译并运行它,您会发现它确实可以工作。

setjmp 不能通过调用 longjmp 返回零。如果您第二次调用 setjmp 本身,即使使用相同的 jmp_buf(就像您在此处所做的那样),它也会第二次返回零。

顺便说一句,你有一个错误:你没有正确设置你的 sigaction 参数结构。你应该这样做:

struct sigaction sa;

sa.sa_handler = SIGSEGV_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sigaction(SIGSEGV, &sa, 0);

mmap 的使用有点不当,但实际上有问题。在大多数当前平台上你不需要 /dev/zero,你可以只使用 MAP_ANON(一些平台拼写为 MAP_ANONYMOUS)和一个 - 1 个 fd 参数。您应该使用 getpagesize 然后请求整数页数。

关于我们可以重置 sigsetjmp 以再次返回 "0"(重置 sigsetjmp)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6985463/

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