linux下c语言的setjmp()与alarm()
#include<stdio.h>#include<stdlib.h>#include<setjmp.h>#include<signal.h>#include<unist...
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
static void fun(void)
{
while (1)
{
fprintf(stderr, "fun()\n");
}
}
static jmp_buf timeout_env;
static void list_timeout(int sig)
{
siglongjmp(timeout_env, 1);
return;
}
void *pfun(void *arg)
{
/* 本来认为siglongjmp()返回之后,fun()占用的栈就被消除,程序会从alarm(0)开始继续跑,结果在linux上直接core掉了?为什么? */
if (sigsetjmp(timeout_env, 1) != 0)
{
alarm(0);
signal(SIGALRM, SIG_IGN);
while (1)
{
fprintf(stderr, "ign\n");
sleep (1);
}
}
signal(SIGALRM, list_timeout);
alarm(3);
fun();
return(0);
}
int main(void)
{
pthread_t pid;
pthread_create(&pid, NULL, pfun, NULL);
pthread_join(pid, NULL);
return(0);
} 展开
#include <stdlib.h>
#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
static void fun(void)
{
while (1)
{
fprintf(stderr, "fun()\n");
}
}
static jmp_buf timeout_env;
static void list_timeout(int sig)
{
siglongjmp(timeout_env, 1);
return;
}
void *pfun(void *arg)
{
/* 本来认为siglongjmp()返回之后,fun()占用的栈就被消除,程序会从alarm(0)开始继续跑,结果在linux上直接core掉了?为什么? */
if (sigsetjmp(timeout_env, 1) != 0)
{
alarm(0);
signal(SIGALRM, SIG_IGN);
while (1)
{
fprintf(stderr, "ign\n");
sleep (1);
}
}
signal(SIGALRM, list_timeout);
alarm(3);
fun();
return(0);
}
int main(void)
{
pthread_t pid;
pthread_create(&pid, NULL, pfun, NULL);
pthread_join(pid, NULL);
return(0);
} 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询