Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Italia
    Messaggi
    6

    Avvio programma demone in C++

    Ho creato un piccolo server in C++ che dovrebbe girare come demone, vorrei però avviarlo da un altro programma scritto in C++, il tutto su ambiente UNIX like o Linux. È possibile fare una cosa del genere?

  2. #2
    I passi per passare in "modalità demone" sono descritti qui; la funzione (non standard) daemon può essere di aiuto per risparmiarti le varie fork necessarie per passare in background e sganciarsi dalla tty iniziale. Se tutto quello che vuoi è avviare un tuo programma come demone, probabilmente la cosa più comoda è fargli accettare uno switch da linea di comando per l'avvio in modalità demone, e avviarlo con questo switch dall'altro programma.
    Ultima modifica di MItaly; 20-12-2013 a 18:06
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Italia
    Messaggi
    6
    Ho letto il primo link ed ho corretto il mio codice, ora sono arrivato a questo:
    #include <cstdlib>#include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>


    using namespace std;


    int main(int argc, char** argv) {
    pid_t pid, sid;
    int result;
    bool start = false;
    pid = fork();
    if ( pid < 0 ){
    cout << "Starting failed!" << endl;
    exit(EXIT_FAILURE);
    }
    if ( pid > 0 ){
    cout << "PID: " << pid << endl;
    exit(EXIT_SUCCESS);
    }
    umask(0);
    sid = setsid();
    if ( sid < 0 ){
    cout << "Starting failed (SID)!" << endl;
    exit(EXIT_FAILURE);
    }
    if ((chdir("/")) < 0) {
    cout << "Starting failed (CHDIR)!" << endl;
    exit(EXIT_FAILURE);
    }
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    while(1){
    if ( start == false ){
    start = true;
    result = system("./cs");
    }
    }
    return 0;
    }
    in pratica il programma dovrebbe avviare il programma cosa (il server demone di cui parlavo nel primo post) e poi chiudersi lasciando avviato il programma cs. Ho compilato e mandato in esecuzione ma quando il programma si chiude il server non risulta avviato. Ho pensato anche a questa variante:
    #include <cstdlib>#include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>


    using namespace std;


    int main(int argc, char** argv) {
    pid_t pid, sid;
    int result;
    bool start = false;
    pid = fork();
    if ( pid < 0 ){
    cout << "Starting failed!" << endl;
    exit(EXIT_FAILURE);
    }
    if ( pid > 0 ){
    cout << "PID: " << pid << endl;
    exit(EXIT_SUCCESS);
    }
    umask(0);
    sid = setsid();
    if ( sid < 0 ){
    cout << "Starting failed (SID)!" << endl;
    exit(EXIT_FAILURE);
    }
    if ((chdir("/")) < 0) {
    cout << "Starting failed (CHDIR)!" << endl;
    exit(EXIT_FAILURE);
    }
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    result = system("./cs");
    }
    Ma non ottengo alcun risultato. Sbaglio qualcosa io ho è l'approccio sbagliato per questo tipo di problema?

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.