서버프로그램 백그라운드로 사용시

익명 사용자의 이미지

제가 채팅프로그램을 하나 짜봤습니다..

그냥 C로 소켓프로그램 연습할려고 해봤습니다.

그냥 터미널 상에서만 되는 건데요..

근데 궁금한것이 하나 있습니다.

보통 program_name &

이런식으로 서버를 백그라운드로 돌리는 걸로 알고 있습니다.

예를 들어 safe_mysqld &

이런식으로요.

근데 제가 만든 서버프로그램은 server &

이런식으로 돌려놓고

서버프로그램실행되는 터미널창을 그대로 놔두고 하면

클라이언트 프로그램으로 접속하는데 아무 문제가 없는데,

서버 돌려놓은 터미널창을 종료시켜버리면

여느 서버 프로그램(마이에스큐엘등등)처럼 계속해서

백그라운드로 실행되지 않고 서버가 종료되어버리더군요

어떻게 종료되지 않고 계속해서 백그라운드로 실행되게 하는지

가르쳐 주시면 감사하겠습니다.

읽어주셔서 감사합니다.

^^

익명 사용자의 이미지

실질적인 서버는 '&'를 이용하지는 않습니다.
fork ()라는 함수를 찾아보세요...
이 함수는 자기 자신을 복사하고 fork ()함수 다음부터 실행을(자기 자신은 물론
복사한 child까지도 fork ()다음부터 실행)합니다.
여기서 중요한건 출력을 일반 터미널로 보내지 않는건데 이유는 그렇게 되면
터미널이 닫혔을 때 에러나 기타 움직이는 사항을 볼 수가 없기 때문이죠.(제경우... ^^;)
그래서 보통 서버 프로그램들은 LOG파일을 가지고 있습니다. (이것도 제경우...)

제가 사용하는 방법은...

main ()
{
// 변수선언
...

switch (fork ()) {
case 0 // child는 0을 가져옴
// 기본값 세팅, 소켓 생성...
...
while (1) {
// accept
sock = accept (...);
if (fork () == 0) {
// 값을 받았을 때 처리부분
...
close (sock);
exit (0);
} else {
close (sock);
}
}
default // Main은 종료...
break;
}
}

몇가지 잡아주어야 하는 건 있지만...
일단 기본적인(저도 배꼈지요. ^^;) 형식은 위와 같습니다.
예전에 fork ()를 한번만 했었는데 그렇게 되면 좀비가 발생할 수 있다는 군요.
위와 같은 형태로 프로그램을 작성하시면 터미널이 종료되도 프로세서는 살아
있으니 한번 해보세요. )

익명 사용자의 이미지


터미널을 끄고도 할수 있는 제가 예전에 찾은 방법은 몇가지 있습니다.

1. 데몬 형식으로 프로그램을 실행 시킵니다..
Redhat => damon 프로그램이름
Debian => start-stop-damon --start 프로그램이름

2. 프로그램 상에서 실행시 .. (해 본적 없음)

#ifdef HAVE_DAEMON

// XXX RH6.0's daemon(), undef HAVE_DAEMON and it should work
daemon(true, false);

#else

if (fork ()) { exit (0); }
close (0); close (1); close (2);

#endif // HAVE_DAEMON

3. 테미널 종료 시켜도 작업계속 하는 명령어 있잖아요.. (뭐더라...???)

질문고수 wrote..
제가 채팅프로그램을 하나 짜봤습니다..

그냥 C로 소켓프로그램 연습할려고 해봤습니다.

그냥 터미널 상에서만 되는 건데요..

근데 궁금한것이 하나 있습니다.

보통 program_name &

이런식으로 서버를 백그라운드로 돌리는 걸로 알고 있습니다.

예를 들어 safe_mysqld &

이런식으로요.

근데 제가 만든 서버프로그램은 server &

이런식으로 돌려놓고

서버프로그램실행되는 터미널창을 그대로 놔두고 하면

클라이언트 프로그램으로 접속하는데 아무 문제가 없는데,

서버 돌려놓은 터미널창을 종료시켜버리면

여느 서버 프로그램(마이에스큐엘등등)처럼 계속해서

백그라운드로 실행되지 않고 서버가 종료되어버리더군요

어떻게 종료되지 않고 계속해서 백그라운드로 실행되게 하는지

가르쳐 주시면 감사하겠습니다.

읽어주셔서 감사합니다.

^^

익명 사용자의 이미지

nohup 으로 띄우면 터미널 닫아도 계속 됩니다..

nohup server

익명 사용자의 이미지

#include
#include

main()
{
pid_t pid;
if ( (pid=fork())<0)
exit(1);
else if (pid!=0)
exit(0);
setsid();
chdir("/");
umask(0);
sleep(10);
return(0);
}

익명 사용자의 이미지

UNIX network programming 책을보면 프로세스를 데몬으로 실행시키는 방법이
자세하게 나와 있습니다.

이것을 라이브러리화 해서 사용해보는것도 좋을듯 합니다. 현재 저도 이것을
라이브러리화해서 사용중입니다.

간략하게 코드를 적어보면

#define MAXFD 64

int MakeDaemon()
{
int i;
int pid;

/* fork 실행 */
if ( (pid = fork()) != 0 )
exit(0);

/* 새로운 session 만들기 */
setsid();

/* SIGHUP signal 무시 */
signal(SIGHUP, SIG_IGN);

/* 한번더 fork */
if ( (pid = fork()) != 0 )
exit(0);

/* umask 변경 */
umask(0);

/* 불필요한 file description 닫기 */
for ( i = 0 ; i < MAXFD ; i++ )
close(i);
}

sun1226의 이미지

fork()를 사용해서 자식프로세스에서 돌리면 될듯.

jika의 이미지

screen 쓰시는것도 한가지 방법이겠습니다.

댓글 달기

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