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?
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?
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.
Ho letto il primo link ed ho corretto il mio codice, ora sono arrivato a questo:
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);
while(1){
if ( start == false ){
start = true;
result = system("./cs");
}
}
return 0;
}
Ma non ottengo alcun risultato. Sbaglio qualcosa io ho è l'approccio sbagliato per questo tipo di problema?#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");
}