[완료] 데몬이 종료시그널을 받기전까지 블럭시킬려면 어떻게 해야되나요??

amiwinner의 이미지

안녕하세요.
윈도우 프밍만하다가 리눅스를 할려니 익숙치 않아서 고생이 많네요.ㅠ.ㅠ.

왠만큼 코드를 옮기고 데몬으로 돌아가게끔 하렬고 합니다.
데몬으로 설정하는 부분은 해놨는데..

이전 콘솔모드에서는 getch()를이용해서 특정문자열이 입력되면 루프가 풀려서

각 객체들의 종료작업을 해주고 프로세스가 죽게끔 했었는데요..

데몬으로 돌리다보니..이부분을 어떻게 처리해주어야 할지 잘 모르겠네요.

그냥 봐서는 특정시그널을 받을때까지 블럭하고 있다가 시그널이 도착하면
블럭이 풀려서 종료작업을 해주면 될듯한데..
어떤 함수들을 사용해서 만들어 주어야 하는지 잘 모르겠습니다.

자료를 찾아보니 kill pid 하면 SIGTERM이 날라간다고 본거 같은데..

보통 어덯게 처리해주면 되나요?

고수님들의 도움좀 부탁합니다.

amiwinner의 이미지

signal()과 pause()를 조합해서 해봤는데..적당한 방법인지..고수님들 도움좀 주세요.ㅠ.
signal은 kill xxxx 할때 발생하는 SIGTERM 으로 처리했습니다.

ddoman의 이미지

종료 시그널을 받을때까지 라고 써놓으셨는데
꼭 종료 시그널이어야하는가요?

또 꼭 시그널( SIGTERM 이라던지 )이어야 하는가요?

단지 특정 신호를 받기전까지 대기 상태로 빠지게 해놓는거면
그냥 파이프나 소켓을 열어 놓고 신호가 올때까지 기다리거나( 그냥 sync I/O를 쓰시면 되겠죠. )

뭐..꼭 종료 시그널로만 처리하고 싶으시다면
저 같음 mutex같은걸로 lock을 걸어놓고
SIGTERM signal handler에서 해당 lock을 풀어버리겠네요

하지만, 특정 조건이 만족 될 때까지 아무것도 안하는 로직을 원하시는것 뿐이라면
저 같음 굳이 시그널을 쓰진 않겠네요. 소켓이나 파이프가 나을듯..

익명 사용자의 이미지

시그널 핸들러 안에서 mutex 를 사용하면 안됩니다.

philnet의 이미지

리눅스에서 사용하는 daemon에 대한 자세한 설명 및 예제 코드는 아래를 참고하시고요...

http://wiki.kldp.org/wiki.php/daemon

아래의 코드는 일반적인 종료 시그널(SIGINT 및 SIGTERM)에 의해 종료되는 application의 작성 예입니다. 이를 참고하셔서 다양한 동작의 작업을 수행하도록 응용하실 수 있을 겁니다.

boolean Daemonize()
{
	pid_t pid;
	if ( (pid = fork()) < 0 )
	{
		PERROR("fail to daemonize\n");
		return FALSE;
	}
	else if (pid != 0)
	{
		exit(0);		// parent goes bye-bye
	}
 
	// child continues
	setsid();			// become session leader
	chdir("/");			// change working directory
	umask(0);
 
	return TRUE;
}
 
boolean InitSignalSetForTermination(sigset_t* a_sigset)
{
	if ( !a_sigset )
	{
		PERROR("arg is NULL\n");
		return FALSE;
	}
 
	if ( sigemptyset(a_sigset) == -1
		|| sigaddset(a_sigset, SIGINT) == -1
		|| sigaddset(a_sigset, SIGTERM) == -1 )
	{
		PERROR("fail to init signal set\n");
		return FALSE;
	}
 
	return TRUE;
}
 
boolean BlockSignalsOfSignalSet(sigset_t* a_sigset)
{
	int retCode;
 
	if ( !a_sigset )
	{
		PERROR("arg is NULL\n");
		return FALSE;
	}
 
	retCode = pthread_sigmask(SIG_BLOCK, a_sigset, NULL);
	if ( retCode )
	{
		PERROR("fail to set signal mask: %d\n", retCode );
		return FALSE;
	}
 
	return TRUE;
}
 
int WaitUntilWantedSignalReceived(sigset_t* a_sigset)
{
	if ( !a_sigset )
	{
		PERROR("arg is NULL\n");
		return FALSE;
	}
 
	while ( TRUE )
	{
		int sigNum;
		int result = 0;
 
		sigwait(a_sigset, &sigNum);
		result = sigismember(a_sigset, sigNum);
		if ( result == 1 )
		{
			PDEBUG("wanted signal(%d) is received\n", sigNum);
			return sigNum;
		}
 
		if ( result == -1 )
		{
			PDEBUG("fail to check received signal(%d)\n", sigNum);
			break;
		}
 
		PDEBUG("other signal(%d) is received\n", sigNum);
	}
 
	return -1;
}
 
void CreateYourOwnWorkingThreads();
void DeleteYourOwnWorkingThreads();
 
int main()
{
	sigset_t sigSet;
 
	Daemonize();
	InitSignalSetForTermination(&sigSet);
	BlockSignalsOfSignalSet(&sigSet);
 
	CreateYourOwnWorkingThreads();
 
	WaitUntilWantedSignalReceived(&sigSet);
 
	DeleteYourOwnWorkingThreads();
 
	return 0;
}
amiwinner의 이미지

답변 감사드립니다.

댓글 달기

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