Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Linux daemon


Автор: Feniksa 22.7.2007, 18:44
Возникла задача такого плана. Нужно что бы приложение стало демоном (то есть можно было писать такое : service myservice start) 

И что бы от терминала моё приложение отвезалось.
Подскажите, в какую сторону мне рыть (на какую тематику) - терминальный ввод-вывод либо процессы.

Автор: mahoro 22.7.2007, 20:32
man 3 daemon

А если вручную, то закрыть STDIN, STD[out,err], и сделать fork. 

И, кроме того, можно вообще ничего не переделывать и запускать программу следующим образом:

nohup program 2>&1 >/dev/null

Автор: Dragon 23.7.2007, 21:49
Пример конвенционного Linux демона :

Примечание: 
1. Демон должен перехватывать все сигналы определенные в системе, которые можно перехватить. Возможно даже SIGSEGV, но это спорный вопрос smile
2. Вместо главного цикла демона (while(true) ) может быть цикл ожидания сетевого event'а и т.п. Если используется бесконечный цикл, нужны sleep'ы

Код

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <errno.h>
#include <string>

#include <sys/types.h>
#include <sys/stat.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <signal.h>
#include <syslog.h>

#include <unistd.h>

using namespace std;

const char *pidFileName = "/var/run/krosavchegd.pid";

void sigTerm(int)
{
    syslog(LOG_INFO, "POKA Krosavchegi!!! Bu-ga-ga!");
    exit(EXIT_SUCCESS);
}

int main(int argc, char *argv[])
{
    // Read and parse configuration file
    syslog(LOG_INFO, "Preved Krosavchegi!!!");
    
    // //////////////////////// //////////////////////// //////////////////////// //////////////////////// //////////////////////// //////////////////////
    // Fork off the parent process
    pid_t pid = fork();
    if(pid < 0)            exit(EXIT_FAILURE);    
    else    if(pid > 0)        
    {
        // Create PID file of child process
        FILE *pPidFile = fopen(pidFileName, "w");
        if(pPidFile == NULL)    syslog(LOG_WARNING, "Cannot create PID file: %s", pidFileName);
        else
        {
            fprintf(pPidFile, "%d\n", pid);
            fclose(pPidFile);
        }
        
        exit(EXIT_SUCCESS);
    }
    
    // Change file mode mask
    umask(0);
    
    // Create a new SID for the child process
    pid_t sid = setsid();
    if(sid < 0)            exit(EXIT_FAILURE);
    
    // Change the current working directory
    if((chdir("/")) < 0)    exit(EXIT_FAILURE);
        
    // Close out the standard file descriptors
    close(STDIN_FILENO);    
    close(STDOUT_FILENO);    
    close(STDERR_FILENO);
    
    // Set signal handlers
    signal(SIGTERM, sigTerm);
    
    short _goingOutgoing = 0;
    while(true)
    {
        if(_goingOutgoing%2)
            syslog(LOG_INFO, "Medved ushel... Bu-ga-ga!!!");
        else
            syslog(LOG_INFO, "Medved prishel... Bu-ga-ga!!!");
                 
        _goingOutgoing++;        
        usleep(10000000);
    }
    
    exit(EXIT_SUCCESS);
}

Автор: Feniksa 23.7.2007, 22:05
mahoro

Dragon, а с медведем прикольно smile БУ ГА ГА smile 

Спасибо... попробую

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)