signal함수 관련하여 도와주세요..고수분들의 도움이 절실합니다...ㅠㅠ

mosad34의 이미지

안녕하세요..이래저래 이곳에 글을 올려 도움도 얻고 방법을 찾아 문제를 해결하고 있는 사람입니다..
현재 문제의 아무리 머리를 굴려도 방법을 찾아보려해도 나오지 않아 다시한번 도움을 요청합니다...
우선 현재 제가 문제를 앓고 있는 부분을 간략화 해본 소스입니다.

////////////////Test.h//////////////////////////

void signalhandler(int a); // Signal 핸들러 함수형태로 저형태를 변경하지 못하네요..;; 인자값을 하나만 더 넘길수만 있었어도..ㅠㅠ
// (함수 형태 변경 않됨..혹시 변경가능하다면 꼭알려주시기 바랍니다!^^;)
class Test //다수의 객체가 생성됨...(클라이언트들이 접속시 Test객체가 각각 생성됨)
{
public:
int foo();
void problem();
sigjmp_buf env;
}
//////////////////////////////////////////////

///////////////////Test.cpp///////////////////
int Test::foo()
{
int ret;
ret = sigsetjmp(env,1); //이부분의 스택 및 환경변수 저장
if(ret == 0) //문제가 발생하여 signal 핸들러 함수에서 왔으면 ret가 1로 그냥 실패, 그렇지 않으면 시그널 함수설정
{
signal(SEGV,signalhandler);// signal함수 설정
}
else
return -1; //그냥 리턴

this.problem(); //Segmentation Fault 발생(발생한다고 가정)

}

void signalhandler(int a) //시그널 핸들러 함수
{
//문제 발생을 기록할것임!
Siglongjmp(xxx,1); //여기서 문제 발생전 환경으로 점프하여 돌아갈것임...
// 하지만 xxx변수는 sigjmp_buf로 문제 발생전의 스택과 환경변수를 가지고 있어야 함..
// 위에 ret = sigsetjmp(env,1);에서 문제발생전의 정보가 담긴 env 가 이곳으로 넘어와서
// siglongjmp를 호출해줘야 하는데..이게 가장 큰 문제입니다...

}

******************************************************************************************************
위에 signalhandler함수 안에서 xxx변수에 Test::foo()에서 문제 발생전의 정보를 저장한 env 변수값이 들어가져야 하는데
어케 건내줄 방법이 없네요..

1.우선 저 env변수를 전역으로 사용하려 하였습니다만...클라이언트들이 붙을때마다 Test라는 객체를 하나씩 만들게 됩니다..
따라서 모든 객체들이 env변수를 공유해버리면 문제가 발생하였을때 그 전으로 돌아가기위한 env변수는 마구 변하게 되므로 정작 문제가 난
객체에서의 문제발생전의 정보를 가져버릴 수 가 없습니다.

2. 저 signal 핸들러 함수를 멤버 함수로 사용해서 쓰면 않되나?
물론 저도 그렇게 해보려했습니다..그렇게되면 망고땡인데 말이죠..-_-;;
하지만 여러자료를 조사하다보니 모라고하더라..this포인터를 넘겨줄수없다나??그래서 굳이 멤버함수를 시그널 핸들러 함수로 쓰러면 static
으로 선언하여 함수를 사용하라고 하더라고요..
근데 그렇게 하면 일반멤버변수를 static으로 선언된 함수내에서 사용불가...즉 사용할 변수도 static으로 해야하는데 그건 위에랑 상황
이 같아 버립니다..ㅠㅠ

머리를 굴려도 답이 안나오네용..;;;;;
저 시그널 핸들러 함수를 변경할수도 없고..;;인자도 늘리는것도 않되고..멤버함수등록도 않되고...
처음엔 sigsetjmp로 signal 핸들러에서 탈출방법을 찾아서 여기까지 왔는데..난관에 부닥쳤네요..;;;

.... Test::foo함수에서 시그널 핸들러를 호출한 후 foo함수가 rerurn -1;
할수 있는 방법은 없는걸까요... 고수님들 도와주세요...ㅠㅠ 이걸로 며칠째인지..에구구..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.