signal함수에 대한 질문..

shs0917의 이미지

요즘 어드밴스트 유닉스 프로그래밍 책을 혼자 공부중인데요..
signal 함수에 대해서 이해가 잘 가지 않아서 질문을 올려봅니다.

#include <signal.h>

void (*signal (int signo, void (*func) (int)) ) (int);

그리고 이 원형을 좀 더 쉽게 하기 위해서..
typedef void Sigfunc(int);

Sigfunc *signal (int, Sigfunc *);

이렇게 되어 있는데요.. typedef해서 void 자리에 저렇게 바꾸면서
해봐도.. 함수가 저렇게 변하는게 이해가 잘 안되요.. :oops:
제가 C언어에 너무 미숙해서 그런거 같은데.. 이게 첫번째 질문입니다.

축약형 원형에서 첫번째 매개변수는 시그널 번호, 두번째 매개변수는
시그널 핸들러.. 이렇게 이해했는데 맞나요?

그리고

signal(SIGINT, SIG_IGN) 이렇게 하면 리턴값은 뭐가 리턴이 되나요?

이게 저의 궁금증입니다..

kslee80의 이미지

첫번째 아규먼트는 시그널 번호, 두번째는 해당 시그널 핸들러...인게 맞습니다.

signal() 함수의 맨 페이지에는 sighandler_t 라는것이 리턴값이라고 되어 있구요,
실제로 리턴되는 값은 해당 시그널 번호의 현재 시그널 핸들러..라고 되어 있습니다.

그리고 sighandler_t 는 signal.h 에 정의에 의하면,

typedef void (*__sighandler_t) (int);
....(중략)...
#ifdef __USE_GNU
typedef __sighandler_t sighandler_t;
#endif

라고 되어 있습니다.

즉, signal() 의 리턴값은 int 형의 아규먼트 하나를 받고,
리턴값이 void 인 함수인 셈이죠.

void (*signal (int signo, void (*func) (int)) ) (int);

이게 한줄로 표현된 전체군요;;

추가:
signal(SIGINT, SIG_IGN); 의 리턴값은 SIGINT 의 기본 핸들러가 리턴될텐데,
man 페이지 7 번 섹션의 signal 을 보면은 SIGINT 의 디폴트 핸들러의 동작은
Term, 즉 현재 프로세스를 종료하는 것이라고 되어 있네요.
그 코드를 담은 함수의 어드레스...가 아닐까 싶네요.

seed의 이미지

void (*signal (int signo, void (*func) (int)) ) (int);

signal이라는 함수는...
* 첫번째 인자: int 형 정수
*두번째 인자: void를 리턴하고 int형 인자를 받는 함수의 포인터를 의미합니다.
* 리턴형: void (* )(int) 라는것을 의미합니다...
즉, 리턴형은 void형을 리턴하고 int형인자를 받는 함수의 포인터입니다.
(아시겠지만... signal함수의 리턴형은 이전 시그널핸들러의 주소값입니다.)
당연히 SIG_IGN을 두번째 인수로 주더라도 리턴형은 함수의 포인터입니다.

그리고 저렇에 정의하는게 보기 약간 불편하니까 typedef를 사용하는것입니다

쓰고보니 질문에서 다 언급하신 내용인것같네요..ㅋ
도움이 되셨기를 바라며...

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.