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


Автор: Leksey 21.4.2005, 18:00
(OS Sun Solaris)
Есть программка, которая прослушивает порт с определенным номером и записывает в файл Ip адрес и доменное имя того, кто подключается к этому порту.
Можно ли сделать так, чтобы она работала в фоновом режиме?
И как потом её завершить?

Автор: dvm 22.4.2005, 16:06
если я тебя правильно понял..
запусти ее с & в конце
только когда из консоли будешь выходить выходи через exit
убить прогу можно ессно через kill или killall

Автор: Leksey 22.4.2005, 17:16
Спасибо dvm, я просто думал что & передается как параметр коммандной строки и его должен обрабатывать программист.
А нет ли более гуманнного способа убить прогу?

Автор: bilbobagginz 22.4.2005, 19:11
а есть ли "гуманный" способ убить человека ?
ну так... чтобы не очень грустно было ....
smile

Автор: Leksey 22.4.2005, 21:42
Я имею в виду можно ,например, задать таймер, чтобы через некоторое время она закрывалась?
И как это сделать?

Автор: Chuck 23.4.2005, 12:13
Цитата
Я имею в виду можно ,например, задать таймер, чтобы через некоторое время она закрывалась?

МожнО smile
Повесить на crond задание, чтоб он убил сам killall прогу через час smile

Автор: Leksey 23.4.2005, 23:10
Chuck не мог ты про crond подробнее рассказать.Что за зверь и чем питается?

Автор: bilbobagginz 25.4.2005, 01:29
Лексей. cron - это хронический демон. он делает задания по таблице crontab периодически, как указано в таблице. у каждого юзера есть ящик скриптов cron, их редактируют с помощью команды:
crontab -e
просматривают с помощью crontab -l
не каждый юзер по умолчанию в соляре имеет право запускать такую штуку.
выкури man crontab


Автор: admsasha 25.4.2005, 02:58
а можно вот так, да ? smile
Код

    if((childpid = fork()) == -1){
        perror("fork");
        exit(1);
    }
    if(childpid == 0){
        close(fd[0]);
    }else{
        close(fd[1]);
        printf("Ушел в фоновый режим \n");
        exit (1);
    }

Автор: Leksey 25.4.2005, 22:00
admsasha Можно поподробнее, ПОЖАЛУЙСТА. smile

Автор: admsasha 26.4.2005, 02:09
Код

#include <fstream>

int main(){
    pid_t   childpid;
    int     fd[2];

    if((childpid = fork()) == -1){
        perror("fork");
        exit(1);
    }
    if(childpid == 0){
        close(fd[0]);
    }else{
        close(fd[1]);
        exit (1);
    }

    // а тут делай что хочешь
    //все будет работь уже в фоне
    return 0;
}



незнаю на сколько так грамотно, но код рабочий smile
Уважаемые Эксперты, поправте мой код, как грамотно этот код написать, может что дополнительно закрывать надо ?

Автор: AndrK 13.7.2006, 16:23
Цитата(admsasha @ 26.4.2005,  02:09)
Код

#include <fstream>

int main(){
    pid_t   childpid;
    int     fd[2];

    if((childpid = fork()) == -1){
        perror("fork");
        exit(1);
    }
    if(childpid == 0){
        close(fd[0]);
    }else{
        close(fd[1]);
        exit (1);
    }

    // а тут делай что хочешь
    //все будет работь уже в фоне
    return 0;
}



незнаю на сколько так грамотно, но код рабочий smile
Уважаемые Эксперты, поправте мой код, как грамотно этот код написать, может что дополнительно закрывать надо ?

Не вкурил... а в массиве fd у тебя че???
И че мы закрываем??? 

Автор: GrayCardinal 14.7.2006, 16:22
Цитата
Не вкурил... 

smile
Цитата
И че мы закрываем???

А черт знает. Смотря с какими флагами собрать. Если без оптимизации, то скорее всего stdin. 
Цитата
незнаю на сколько так грамотно, но код рабочий

 smile 

Цитата
Можно поподробнее

Код

/*
 * (c) Oleg Puchinin 2006 
 * [email protected]
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char ** argv)
{
    int pid;
    int fd = open ("/dev/null");

    if (fd < 0) {
        perror ("open /dev/nulL");
        return -1;
    }
        
    pid = fork ();
    if (pid < 0) {
        perror ("fork");
        return -1;
    }
        
    if (pid == 0) {
        dup2 (fd, 0);
        dup2 (fd, 1);
        dup2 (fd, 2);
        chdir ("/");    

        execlp ( ... );
    } else 
        return 0;
}
  

Автор: bsa 14.7.2006, 21:30
А разве на соляре команда man не работает?!? Или нет страниц 2 и 3 уровней? Человек пишет прогу, работающую с сокетами (а как еще слушать порт?), а не знает элементарных вещей.
man fork: http://unixhelp.ed.ac.uk/CGI/man-cgi?fork+2 - это команда, которая позволяет запускать "демоны" из самой программы (а точнее, она создает копию вызвавшего процесса).


GrayCardinal, зачем нужно копировать стандартные потоки? Разве fork это сама не делает? Может правильнее их закрывать? 

Автор: GrayCardinal 15.7.2006, 06:57
bsa
Цитата
 Разве fork это сама не делае

Так dup2 :
1. _Закрывает_ второй аргумент.
2. Копирует на его место _первый_ аргумент. В данном случае fd (/dev/null) 
В результате stdin/stdout/stderr получается /dev/null.  Кто-то про маны говорил. Хе-хе. smile 
 

Автор: kirjanov 10.8.2006, 13:49
Код

#define MAXFD 32

void daemon_start()
{
   int i;
   pid_t pid;
   if ((pid = fork()) != 0)
      exit(0);
   setsid();
   signal(SIGHUP,SIG_IGN);
   chdir("/");
   umask(0);
   for (i = 0;I < MAXFD;i++)
      close(i);
   openlog(argv[0],LOG_PID,SOME_FACILITY_ARGS);
}

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