2015-05-25 2 views
0

Я пытаюсь создать фоновую программу с основным конфигурационным файлом, который содержит другие местоположения конфигурационного файла и выполняет каждый из них. Например: если main_config.conf:Фоновое программирование в C

/home/conf1 
/home/conf2 

я хочу, чтобы выполнить ./background_pro /home/conf1 и ./background_pro /home/conf2 в фоновом режиме. Как мне это сделать ? Я использую ниже structure.Thank вы

#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <unistd.h> 
#include <syslog.h> 
#include <string.h> 

int main(void) { 

     /* Our process ID and Session ID */ 
     pid_t pid, sid; 

     /* Fork off the parent process */ 
     pid = fork(); 
     if (pid < 0) { 
       exit(EXIT_FAILURE); 
     } 
     /* If we got a good PID, then 
      we can exit the parent process. */ 
     if (pid > 0) { 
       exit(EXIT_SUCCESS); 
     } 

     /* Change the file mode mask */ 
     umask(0); 

     /* Open any logs here */   

     /* Create a new SID for the child process */ 
     sid = setsid(); 
     if (sid < 0) { 
       /* Log the failure */ 
       exit(EXIT_FAILURE); 
     } 



     /* Change the current working directory */ 
     if ((chdir("/")) < 0) { 
       /* Log the failure */ 
       exit(EXIT_FAILURE); 
     } 

     /* Close out the standard file descriptors */ 
     close(STDIN_FILENO); 
     close(STDOUT_FILENO); 
     close(STDERR_FILENO); 

     /* Daemon-specific initialization goes here */ 

     /* The Big Loop */ 
     while (1) { 
      /* Do some task here ... */ 

      sleep(30); /* wait 30 seconds */ 
     } 
    exit(EXIT_SUCCESS); 
} 
+0

В чем ваш вопрос, я имею в виду, что именно вас беспокоит? –

+0

После закрытия стандартных дескрипторов вы должны, вероятно, открыть их на '/ dev/null', так как некоторые функции библиотеки могут ожидать их открытия. – Barmar

+0

Кроме этого, ваша структура кажется ОК. – Barmar

ответ

1

Просто добавьте в «&» в задней части команды оболочки, то команда будет работать в фоновом режиме. Я думаю, что это может быть то, что вы хотите: daemon.bash

#!bash 

# to stop a sub process 
if [ "x$1" = "x-stop" ]; then 
    if [ "x$2" = "xsub1" ]; then 
     kill `cat sub1.pid` 
    elif [ "x$2" = "xsub2" ]; then 
     kill `cat sub2.pid` 
    fi 
    exit 
fi 

# to start sub processes 
conf1=`head -1 main_config.conf` 
conf2=`head -2 main_config.conf | tail -1` 
nohup ./background_pro $conf1 & 
pid1=$! 
echo "$pid1" > sub1.pid 
nohup ./background_pro $conf2 & 
pid2=$! 
echo "$pid2" > sub2.pid 

Запуск демона:

nohup ./daemon.bash & 

nohup будет держать программа работает даже при выключении терминала.

Остановить процесс суб 1:

./daemon.bash -stop sub1 
+0

http://pastebin.com/FMziPP4k это правильно? когда я пытаюсь './script start &' он выводит http://pastebin.com/NYup97BM – Odko

+0

Нужно ли мне добавить код демона? в главном вопросе? – Odko

+0

и как добавить стоп-регистр в скрипт? – Odko

0

Фоновый программа может быть то, что Linux пользователи называют программу "Daemon". Пожалуйста, смотрите здесь: Creating a daemon in Linux, где вы можете найти множество информации о том, как начать писать свой собственный демонов. Для анализа аргументов командной строки я рекомендую прочитать руководство библиотеки GNU c для getopt().

Смежные вопросы