LINUX.ORG.RU

man 3 daemon

anonymous
()

Для родительского процесса:
if (fork()!=0)exit(0);
Для дочернего процесса:
setsid();
close(stdin);
close(stdout);
close(stderr);
chdir("/");
И ты уже в демоне. Дальше - тело демона.

josephson ★★
()
Ответ на: комментарий от josephson

Неточность.
Для close() используй 0,1,2 либо close() замени на fclose() для stdin,stdout,stderr.
По демонам что-то было в книге: Робачевский Андрей "Операционная система Unix" (если мне память не изменяет).

josephson ★★
()
Ответ на: комментарий от josephson

Посмотри может поможет:

...
void fn_setdaemon(const char * namelogFile);
void fn_server(void);

int main(int argc, char** argv)
{
  const char * namelogFile = "/var/log/mydaemon.log";
  if (fork() != 0)
    {  _exit(0);  }

  // child_1
  fn_setdaemon(namelogFile);
  return 0;
} // main()

void fn_setdaemon(const char * namelogFile)
{
  // child_1
  // set glavn process
  setsid();

  if (fork() != 0)
    {  _exit(0);  }

  // child_2  
  try
  {
      //iChildPid = getpid();
      //printf("child: pid=%d \n", iChildPid);

      // 
      chdir("/");
      umask(0);     

      // ignor. signals      
      // close descriptors files
      struct rlimit  rlim;
      getrlimit(RLIMIT_NOFILE, &rlim);
    
      // закрываем все открытые дескрипторы 
      for (int fd=0; fd < rlim.rlim_max; fd++)
        close(fd);

      umask(0133);

      // open "stdin"
      stdin = fopen("/dev/null", "a+"); // = 0
      if (stdin == NULL)
        throw clError("error: stdin=fopen(\"/dev/null\")\n");

      // open "stdout"  = file_log
      stdout = fopen(namelogFile, "a+");    // = 1
      if (stdout == NULL)
        throw clError("error: stdout=fopen(\"namelogFile\")\n");

      // для того что бы ошибки писались
      //  в выходной поток,
      //  который сбрасываем в лог-файл.  
      // open "stderr"
      stderr = stdout;           // = 2

      fflush(stdout);
      fflush(stderr);

      // START SERVER
      fn_server();


      fflush(stdout);
      fflush(stderr);

      fclose(stdin);
      fclose(stdout);
      fclose(stderr);

    } 
    catch(clError & er)
    {
      printf("error: '%s' \n", er() );
    }
    catch(...)
    {
      printf("error: '...' \n");
    }

} // fn_setdaemon()

void fn_server(void)
{
  ....
} // fn_server(void)


>По демонам что-то было в книге: Робачевский Андрей "Операционная система Unix" 
>(если мне память не изменяет).
Там мало и не понятно но что-то можно найти.
 
Конкретные книжки: 
У. Стивенс: Unix: Разработка сетевых приложений.  - 
красная книжка,  Ульям,  Разработка сетевых приложений под Linux
желтая автора не помню (Дуглас, Камер  ??) TCP/IP вроде 3 том,
  но точно не помню, там где программирование.
Там много интересного и в частности по созданию серверных приложений. 
Есть примеры кода - в Internete.

anonymous
()
Ответ на: комментарий от anonymous

Не в Инете, а на полках магазина.  Слишком круто чтоб такие вещи
свободно распространять. За мозги всеж платить нужно.
В инете примеры к этим книгам.
В книгах этих указаны сайты, с которых можно скачать эти примеры.
по приаритетам для быстрого написания сервера:
1. красная + желтая(классика)
2. У.Стивенс  - это классика 

а можно и без книг, но нужно знать архитектуру OS.
Не Unix/Linux, а вообще, 
 + TCP/IP и доступ через библиотеку Unix-API,
 но книги только усилят и улучшат знания. 

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.