The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Демон с помощью gcc"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Демон с помощью gcc"
Сообщение от Blacki emailИскать по авторуВ закладки on 10-Июн-02, 20:51  (MSK)
Народ, пишу программу на с. Как мне сделать чтобы она демоном запускалась, т.е. не зависела от конслои из которой её запустили(и не вырабалась при выключении консоли). И как тогда потом её остановить её и перезапустить.
Проблема из-за того, что если запускать в фоновом режиме программу, то выключить её могу только грубо, а так не хотелось бы.
И как запустить чужую прогу демоном???
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Демон с помощью gcc"
Сообщение от Арлекин emailИскать по авторуВ закладки on 11-Июн-02, 08:19  (MSK)
Разбирайся с сигналами. Для начала man signal.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Демон с помощью gcc"
Сообщение от fefelov Искать по авторуВ закладки on 11-Июн-02, 23:36  (MSK)
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

#include "error.h"
#include "daemon.h"

/* daemon ***********************************************************
*/
int
daemon(const char* rootDir, const char* pidFile)
{
  int  rc;
  int  maxfd;
  int  fd;
  char s[32];

  /* fork() so the parent can exit, this returns control to the command
     line or shell invoking our program. This step is required so that
     the new process is guaranteed not to be a process group leader. The
     next step, setsid(), fails if we're a process group leader.
  */
  rc = fork();
  if (rc < 0)
    stopOnError("daemon(): unable to fork()");
  if (rc > 0)
    exit(EXIT_SUCCESS); /* End parent process. */

  /* setsid() to become a process group and session group leader. Since
     a controlling terminal is associated with a session, and this new
     session has not yet acquired a controlling terminal our process now
     has no controlling terminal, which is a good thing for daemons.
  */
  rc = setsid();
  if (rc == -1)
    stopOnError("daemon(): unable to setsid()");

  /* fork() again so the parent (the session group leader) can exit. This
     means that we, as a non-session group leader, can never regain a
     controlling terminal.
  */
  rc = fork();
  if (rc < 0)
    stopOnError("daemon(): unable to fork()");
  if (rc > 0)
    exit(EXIT_SUCCESS); /* End parent process. */

  /* chdir("/") to ensure that our process doesn't keep any directory
     in use. Failure to do this could make it so that an administrator
     couldn't unmount a filesystem, because it was our current directory.
  */
  if (rootDir != NULL)
  {
    rc = chdir(rootDir);
    if (rc == -1)
      stopOnError("daemon(): unable to chdir()");
  }

  /*  We close all open file descriptors that may have been inherited
     from the parent process. This is to reduce the resources we use.
  */
  maxfd = sysconf(_SC_OPEN_MAX);
  for (fd = maxfd - 1; fd >= 0; fd--)
    close(fd); /* Ignore errors. */

  /* Establish new open descriptors for stdin, stdout, and stderr. Even if
     we don't plan to use them, it is still a good idea to have them open.
  */
  fd = open("/dev/null", O_RDWR); /* stdin - file handle 0. */
  dup(fd);                        /* stdout - file handle 1. */
  dup(fd);                        /* stderr - file handle 2. */

  /* Write pid-file.
  */
  if (pidFile != NULL)
  {
    sprintf(s, "%u\n", getpid());
    fd = open(pidFile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR );
    if (fd == -1)
      stopOnError("daemon(): unable to create pid-file");
    if (write(fd, s, strlen(s)) == -1)
      stopOnError("daemon(): unable to write pid-file");
    close(fd);
  }

  return 0;
}


  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Демон с помощью gcc"
Сообщение от Blacki emailИскать по авторуВ закладки on 13-Июн-02, 12:22  (MSK)
>#include <stdlib.h>
>#include <sys/types.h>
>#include <unistd.h>
>
>
>
>#include "error.h"
>#include "daemon.h"
>
>
>
>/* daemon ***********************************************************
>*/
>int
>daemon(const char* rootDir, const char* pidFile)
>{
>  int  rc;
>  int  maxfd;
>  int  fd;
>  char s[32];
>
>  /* fork() so the parent can exit, this returns control
>to the command
>     line or shell invoking our program. This
>step is required so that
>     the new process is guaranteed not to
>be a process group leader. The
>     next step, setsid(), fails if we're a
>process group leader.
>  */
>  rc = fork();
>  if (rc < 0)
>    stopOnError("daemon(): unable to fork()");
>  if (rc > 0)
>    exit(EXIT_SUCCESS); /* End parent process. */
>
>  /* setsid() to become a process group and session group
>leader. Since
>     a controlling terminal is associated with a
>session, and this new
>     session has not yet acquired a controlling
>terminal our process now
>     has no controlling terminal, which is a
>good thing for daemons.
>  */
>  rc = setsid();
>  if (rc == -1)
>    stopOnError("daemon(): unable to setsid()");
>
>  /* fork() again so the parent (the session group leader)
>can exit. This
>     means that we, as a non-session group
>leader, can never regain a
>     controlling terminal.
>  */
>  rc = fork();
>  if (rc < 0)
>    stopOnError("daemon(): unable to fork()");
>  if (rc > 0)
>    exit(EXIT_SUCCESS); /* End parent process. */
>
>  /* chdir("/") to ensure that our process doesn't keep any
>directory
>     in use. Failure to do this could
>make it so that an administrator
>     couldn't unmount a filesystem, because it was
>our current directory.
>  */
>  if (rootDir != NULL)
>  {
>    rc = chdir(rootDir);
>    if (rc == -1)
>      stopOnError("daemon(): unable to chdir()");
>  }
>
>  /*  We close all open file descriptors that may
>have been inherited
>     from the parent process. This is to
>reduce the resources we use.
>  */
>  maxfd = sysconf(_SC_OPEN_MAX);
>  for (fd = maxfd - 1; fd >= 0; fd--)
>    close(fd); /* Ignore errors. */
>
>  /* Establish new open descriptors for stdin, stdout, and stderr.
>Even if
>     we don't plan to use them, it
>is still a good idea to have them open.
>  */
>  fd = open("/dev/null", O_RDWR); /* stdin - file handle 0.
>*/
>  dup(fd);          
>          
>   /* stdout - file handle 1. */
>  dup(fd);          
>          
>   /* stderr - file handle 2. */
>
>  /* Write pid-file.
>  */
>  if (pidFile != NULL)
>  {
>    sprintf(s, "%u\n", getpid());
>    fd = open(pidFile, O_RDWR | O_CREAT, S_IRUSR |
>S_IWUSR );
>    if (fd == -1)
>      stopOnError("daemon(): unable to create pid-file");
>    if (write(fd, s, strlen(s)) == -1)
>      stopOnError("daemon(): unable to write pid-file");
>    close(fd);
>  }
>
>  return 0;
>}


Да но как потом допустим его остановить?Да и вообще как реализовать вот это:
запускаю: my_prog start
запускается как демон
запускаю: my_prog stop
останавливается

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Демон с помощью gcc"
Сообщение от fefelov Искать по авторуВ закладки on 13-Июн-02, 15:42  (MSK)
PID сохраняется в файле. Поэтому при желании остановить сию программу, нужно кильнуть процесс с этим PID.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "RE: Демон с помощью gcc"
Сообщение от pth Искать по авторуВ закладки on 16-Июн-02, 22:56  (MSK)
Для такого вопроса достаточно nohup progname &.


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру