URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 789
[ Назад ]

Исходное сообщение
"Демон с помощью gcc"

Отправлено Blacki , 10-Июн-02 20:51 
Народ, пишу программу на с. Как мне сделать чтобы она демоном запускалась, т.е. не зависела от конслои из которой её запустили(и не вырабалась при выключении консоли). И как тогда потом её остановить её и перезапустить.
Проблема из-за того, что если запускать в фоновом режиме программу, то выключить её могу только грубо, а так не хотелось бы.
И как запустить чужую прогу демоном???

Содержание

Сообщения в этом обсуждении
"RE: Демон с помощью gcc"
Отправлено Арлекин , 11-Июн-02 08:19 
Разбирайся с сигналами. Для начала man signal.

"RE: Демон с помощью gcc"
Отправлено fefelov , 11-Июн-02 23:36 
#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;
}



"RE: Демон с помощью gcc"
Отправлено Blacki , 13-Июн-02 12:22 
>#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
останавливается


"RE: Демон с помощью gcc"
Отправлено fefelov , 13-Июн-02 15:42 
PID сохраняется в файле. Поэтому при желании остановить сию программу, нужно кильнуть процесс с этим PID.

"RE: Демон с помощью gcc"
Отправлено pth , 16-Июн-02 22:56 
Для такого вопроса достаточно nohup progname &.