|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2690
|
[C++] Problema con processi child
ok il titolo non e' molto esplicativo ma e' difficile spiegarlo in una riga...
cmq in pratica, sto cercando di fare un CGI in c++ che mi esegua un demone... (si, sotto linux) il che non e' un gran problema, fino al momento, pero', in cui il server http (mini_httpd) continua ad aspettare la terminazione del demone per finire il suo lavoro... il bello e' che il CGI invece termina tranquillamente. attualmente uso system() per eseguire il demone, pero' ho provato anche con popen() e non ho ottenuto risultati... so per certo che un modo c'e' per farlo, visto che un CGI precompilato funziona nello stesso identico ambiente |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Ovvio, system() è bloccante, finché non termina il demone. Non vedo come il cgi possa terminarti, visto che la system ritorna solo quando il child è morto.
Soluzione: fork [ + setsid ] + exec.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2690
|
Quote:
ok fork ed exec li stavo guardando anche se la documentazione che ho trovato no ne' chiarissima... mentre setsid mi e' oscuro come modificheresti questo codice? int main(void){ system("/usr/sbin/utelnetd -p 24 -d \&"); cout<<"Content-type: text/html\n\nciao"; return 0; } |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Prova con:
Codice:
if (fork()==0) {
int fd = open("/dev/null", O_RDWR);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if (fd>2)
close(fd);
setsid();
system("/usr/sbin/utelnetd -p 24 -d");
exit(0);
} else {
cout<<"Content-type: text/html\n\nciao";
_exit(0);
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 15-12-2006 alle 13:32. |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2690
|
Quote:
ho tolto l'ultimo _exit(0); altrimenti non mi manda l'output al browser cmq ti ringrazio tantiiiiiiissimo :* avevo provato con sta roba trovata su un sito Codice:
cout<<"Content-type: text/html\n\nciao";
switch(fork()){
case 0: break;
case -1: cout <<"ERRORE";
default: _exit(0);
}
if (setsid() == 0) {
cout <<"ERRORE2";
exit(0);
}
if (fork() != 0)
exit(0);
execl("/usr/sbin/","utelnetd -p 24 -d \&",NULL);
edit: in pratica con fd, dup2 ecc gli hai chiuso stdin, stdout e stderr? Ultima modifica di Braccop : 15-12-2006 alle 13:43. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
dprintf(fileno(stdout), "%s", "Content-type: text/html\n\nciao");
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2690
|
Quote:
edit: mh mi pare di capire che _exit() termina immediatamente e brutalmente mentre exit() chiude in maniera normale? Ultima modifica di Braccop : 15-12-2006 alle 13:49. |
|
|
|
|
|
|
#8 | ||||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
execl("/usr/sbin/utelnetd", "-p 24 -d \&", NULL);
ma sei fissato con 'sta dprintf ???
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2690
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
#include <stdio.h>
int main()
{
printf( "Content-type: text/html\n\nciao\n");
switch(fork())
{
case 0:
/* CHILD */
break;
case -1:
printf("ERRORE");
_exit(0);
default:
printf("PARENT\n");
_exit(0);
}
if (setsid() == 0)
{
printf("ERRORE2");
exit(0);
}
printf("CHILD\n");
execl("/usr/bin/ls", "-l \&", NULL);
fflush(stdout);
return 0;
}
Funziona e ho spostatto un pó di cose oltre che mettere il comando "ls" perché non ho "utelnetd". La doppia fork non serve, ma basta la prima. Se vedi 0 = CHILD e > 0 PARENT. Se lo esegui scrive prima child e dopo parent perché il programma si clona quindi l'ordine delle istruzioni non conta ma conta ció che fa il sistema operativo. Prima crea il figlio e lo lancia poi contiua il padre. "setsid" l'ho lasciato ma dubito serva a qualcosa (ma fidati piú di quel che ti dice ilsensine Ciao
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#12 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Codice:
execl("/usr/sbin/utelnetd", "-p", "24", "-d", NULL);
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 2690
|
vabe io ho messo tutto in una funzione
Codice:
//this runs the command as a new standalone process
//useful to run daemons so mini_httpd does not wait
//for them to terminate
void rundaemon(string cmd){
if (fork()==0) {
int fd = open("/dev/null", O_RDWR);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if (fd>2)
close(fd);
setsid();
system(cmd.c_str());
exit(0);
}// else {
//_exit(0);}
}
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
uso questo 3d perché la mia domanda é perfettamente IT quindi inutile aprirne un altro.
In un altro 3d ho parlato di un pro*C che doveva auto-trussarsi (auto trace) e infatti l'ho fatto e va bene, ma sul mini prog di prova per testare m'e rimasto un dubbio. L'ultima funzione Codice:
printf("CHILD 2\n");
(come in un altro prog sopra in questo 3d). Se la tolgo il prog finisce senza apsettare. Ma perché tutto ció ? il "\n" non equivale ad un fflush ? E poi c'é un return 0 dopo! viene ignorato ??? Codice:
...
printf("CHILD\n");
sprintf( cmd, "/bin/truss -aef -wall -vall -rall -o %s/SRC/C/TEST/autotruss.dat -p %i"
, getenv( "HOME" ), Pid);
puts(cmd);
system( cmd);
printf("CHILD 2\n\r");
}
return 0;
}
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:25.



















