static함수에서 멤버변수를 쓸수 있는 방법이 있을까요?
안녕하세요 다름이 아니고..프로그램을 하다가 문제에 도달하게 되었습니다.
signal을 사용하는데 signal 핸들러 함수를 클래스 멤버 함수로 사용해야 하는데요...
찾아보니 static 멤버함수로 사용하면 된다고 해서 static멤버 함수로 핸들러를 등록해놨어요..;;
그런데 static으로 함수를 선언하다 보니 클래스 일반 멤버변수들을 사용할 길이 없지 뭡니까?/,,,ㅠㅠ
클래스에 static멤버 함수 내에서 클래스의 일반 멤버변수들을 사용해야 하는데..난감해졌습니다...;;
signal핸들러를 static으로 선언하지 않고는 등록이 않되더라고요..
(c함수에서는 그냥 하면 되나 클래스 멤버함수 등록시에는 static으로 선언하고 등록해야 에러없이 진행됨..자료도 찾아보고 테스트도 해봤어요..ㅠㅠ)
그렇다고 멤버변수를 static으로 선언해서 쓸수도 없습니다 ...객체가 많이 만들어지기 때문에 static으로 선언한 변수는 한 객체에서만 독립적으로 사용할수도 없고요..ㅠㅠ
고수님들 뭔가 방법이 없을까???
(아참 여기서 static으로 선언된 함수는 인자를 받아들일수가 없어요..ㅠㅠ, 전역변수를 설정해서 넣으라는 그런 방법은 않되염..ㅠㅠ)
1. static함수에서 일반 멤버변수에 접근하는 방법은?
2. signal 핸들러 함수를 멤버함수로 등록시 static으로 선언하지 않고 쓰는 방법은?(아마 없을거 같지만..혹시라도 몰라 질문해봐요..ㅠㅠ)
불가능한 걸 요구하고 계시네요
A라는 클래스를 선언하고 인스턴스를 마구 만들어서 A1 A2 A3 A4 ... 이렇게 A100까지 있다고 칩시다.
시그널 핸들러가 A의 static 함수를 불렀습니다.
자, 이 시그널 핸들러가 어느 인스턴스의 멤버 변수를 참조했으면 좋겠습니까? A1? A2? A3? 그냥 알아서 잘?
그런 게 될 리가... -_-;;;
* 그리고 잘은 모르지만 아무리 static method라도 signal handler로 바로 넣는 게 표준에서 되나 잘 모르겠네요, 스태틱 멤버 함수를 부르는 일반 함수를 하나 만들어서 그걸 signal handler로 등록하는 게 안전할 것 같습니다.
음..그러네요...제
음..그러네요...제 생각이 짧았던거 같습니다.
static으로 선언한 함수에서 this 메소드로 현재 클래스의 멤버변수를 호출하면 가능할 줄 알았습니다.(이렇게 생각이 짧았다니..'';;;)
다시 한번 질문한번 올리게요..
현재 sigsetjmp와 siglongjmp를 같이 사용하려고 하거든요..
핸들러함수에서 siglongjmp를 이용해 문제가 발생한 이전 시점으로 돌아가 처리하려고 하거든요..
그런데 여기서 문제가 siglongjmp를 이용해서 문제 발생이전 시점으로 돌아가기 위한 스택과 환경변수등을 저장하는 sigjmp_buf가 문제입니다
예)
/////////////////////Test.h
void SinalHandler(int signo);
class Test
{
public:
sigjmp_buf env; //스택과 환경변수등을 저장하기 위한 변수
int foo();
void Problem();//문제가 일어나는 함수
}
///////////////////Test.cpp
void SinalHandler(int signo)
{
//문제 발생을 기록
siglongjmp(env,1) //여기서 문제가 발생: env변수를 사용할 수가 없습니다.
//위 클래스의 객체의 인스터를 얻어와서 멤버변수를 사용하면 될까요?
//env를 전역이나 static으로 사용하게 된다면 여러클래스에서 간접이 생겨버리게 됩니다.
//방법은 현재 실행하고잇는 인스턴스를 얻어와 멤버변수를 사용해서 선언하면 될까요?
// Test객체는 이미 다른곳에서 만들어놓은 상태입니다.
//이곳에 멤버변수인 env를 가져다 쓸수 있는 방법이 뭐가 있을까요...흠.';???????????????
}
int Test::foo()
{
int ret;
ret = sigsetjmp(env, 1);
if(ret == 0)
{
this.Problem();// segmentation fault 발생
}
else
return -1;
}
즉 일반 함수에 클래스 멤버 변수를 호출하는 방법(여기서의 일반함수는 시그널 핸들러 함수입니다...ㅠㅠ)
조금만 더 도움을 주십시요..
시그널이 리눅스의
시그널이 리눅스의 시그널인지 모르겠는데요.
핸들러에 인자를 하나 넘길 수 있고,
그 핸들러가 하나의 객체와 연관되어 있다면
핸들러의 인자로 그 객체의 포인터를 넘기고
핸들러 내부에서 그 객체의 멤버에는 접근할 수 있어요.
class A {
int data_;
public:
A(): data_(1) {}
static void accessData(void *p)
{
A *self = (A*)p;
self->data_ = -1;
}
void setNegData()
{
A::accessData(this);
}
};
int main()
{
A a;
a.setNegData();
}
이런 식으로요.
원하시는 게 맞는지 모르겠지만 도움이 되셨음 좋겠군요.
문제 상황을 제대로
문제 상황을 제대로 이해할 필요가 있을 것같은데, 질문하신 분조차 파악이 제대로 안되신거 같습니다.
질문 상황이 잘 이해가 안되서 전혀 엉뚱한 답변일수도 있는데, 디자인 패턴의 하나인 싱글톤(singleton) 패턴에 대해서 한번 찾아보세요.
음..문제 상황이
음..문제 상황이 제대로 파악이 안된건 아닙니다..;;
간단히 말하면 시그널 핸들러에 클래스 맴버변수를 사용할 수 있느냐 입니다..
시그널 핸들러는 static으로 선언되어 있고요...
제가 질문을 어수룩하게 했나 보군요..;;
그리고 시그널 핸들러 함수의 형태는 XXXX(int); 형태로 사용되어야 합니다..
댓글 달기