시그널을 발생 시키고 시그널 핸들러를 다른 함수에 포함 시킬 수 있나요?

hancar01의 이미지

예를 들어 func1 에서 시그널을 발생 시키면 func2 에서 시그널 발생 여부를 알 수 있나요?

void sigHandler(sig)
{
 ... 
}
 
func1 () 
{
  signal(SIGUSR1, sigHandler);
  raise(SIGUSR1);
}
 
func2 ()
{
  // 시그널 발생 여부 확인
}
라스코니의 이미지

func2()에서 세마포로 대기하고 있다가, sigHandler()에서 func2()가 대기하고 있는 세마포 신호를 보내주면 됩니다.

void sigHandler()
{
   semaphore send;
   ...
}
 
func2()
{
   semaphore wait;
   do something;
}

hancar01의 이미지

lock을 사용하지 않고 할 수 있는 방법은 없을까요?
타이밍 상 크리티컬한 이슈가 발생할 가능성이 있어서요...

라스코니의 이미지

좀 더 상황에 대한 설명을 주셔야 할 것 같습니다.
func2()가 시그널의 발생 존재를 무한정 기다릴지, 아니면 기다리지 않을지에 따라서도 선택지가 달라질 것 같네요.
func2()가 쓰레드로 돌고 있으면 타이밍에서 문제가 발생할 것 같지 않은데요?

hancar01의 이미지

각 함수는 메인 쓰레드에서 호출하여 사용하고 있습니다.

func1()은 UI에서 특정 버튼을 누르면 호출 하는 함수이고,
func2()은 특정 동작을 하는 함수 입니다.

메인에서 func1()을 호출 하면 시그널을 발생 시키고 func2()에서 시그널을 발생 여부를 확인 하고 특별한 조건을 만족 하는 경우에 액션을 취하려고 합니다.

non block 함수 입니다.

라스코니의 이미지

func1()에서 func2()로 시그널이나 세마포를 주면 되지 않을까요?

익명 사용자의 이미지

func1 에서 func2 를 실행시키면 되지 않을까요.
아니면 callback 을 등록하는 방법을 사용해도 되고,
http://man7.org/linux/man-pages/man2/signal.2.html
man 페이지보면

#include <signal.h>
 
typedef void (*sighandler_t)(int);
 
sighandler_t signal(int signum, sighandler_t handler);

signal() 함수로 원하시는 동작 구현하실 수 있을 것 같습니다.

jick의 이미지

부연 설명을 보니까 더 이해가 안가는데, 둘 다 메인 쓰레드에서 돌아가는 함수면 signal이 왜 필요하죠?

UI에서 특정 버튼을 누르면 전체 변수로 button_pressed = 1; 같은 거 넣어주고, func2에서는 시작할 때 if (button_pressed) 하면 되는 거 아닌가요?

익명 사용자의 이미지

그러게요. func1(), func2() 가 서로 다른 프로세스에서 돌아가는 거라면 IPC 가 필요하겠지만, 위 경우는 그냥 말씀대로 button_pressed flag 체크하거나, signal 에 핸들러로 func2() 등록해서 실행하면 되는데 흠. func2()가 스레드로 또는 루프로 돌아가는 거라면 select, poll 같은 걸로 체크하면 될 거고, 뭔가 좀. 어차피 이벤트 루프 돌면 변수 체크하면 되는거고,.. GUI 라는게 event loop 도는 건데.
질문을 자세히 설명하면 안 되는 뭔가가 있나보죠.

댓글 달기

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