다른 사람이 말했듯이, 당신은 당신이 요구하는지 정확하게 할 수 없습니다.
같은 목적을 달성하는 동안 이러한 변수를 전역으로 만드는 것을 피하는 다른 방법은 물론 있습니다. 가치있는 일인지 여부는 상황에 따라 다릅니다. 여기에 free()
에 원하는 물건을 유틸리티 함수로 등록하고 신호 처리기에서 호출하는 방법이 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#define STACK_SIZE 100
struct mystruct {
int a;
int b;
};
enum manage_action {
MYSTRUCT_STORE,
MYSTRUCT_FREE
};
void manage_allocs(void * p, enum manage_action act)
{
static void * ptr_stack[STACK_SIZE];
static int top = 0;
switch (act) {
case MYSTRUCT_STORE:
if (top == STACK_SIZE) {
perror("Stack overflow");
exit(EXIT_FAILURE);
}
ptr_stack[top++] = p;
break;
case MYSTRUCT_FREE:
for (int i = 0; i < top; ++i) {
free(ptr_stack[i]);
}
top = 0;
break;
}
}
void handler(int dummy)
{
manage_allocs(NULL, MYSTRUCT_FREE);
}
int main(void) {
struct mystruct * a = malloc(sizeof *a);
struct mystruct * b = malloc(sizeof *b);
if (!a || !b) {
perror("Couldn't allocate memory");
return EXIT_FAILURE;
}
manage_allocs(a, MYSTRUCT_STORE);
manage_allocs(b, MYSTRUCT_STORE);
signal(SIGINT, handler);
pause();
return 0;
}
free()
는-비동기 안전이 보장되지 (어느 쪽도 전체의 manage_allocs()
기능은 그 문제이다), 그래서 시그널 핸들러에서 호출에 대한 일반적인주의 사항이 적용 것, 그리고 확실하고 있습니다되지 않는다 그것은 결코 다시 입력되지 않을 것입니다.
는 제 커널은 핸들러로 호출 할 수있는 함수의 주소를 필요로한다. –