Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problemi con processi defunti
Forum - C/C++ - Problemi con processi defunti

Avatar
Alexi (Normal User)
Newbie


Messaggi: 2
Iscritto: 07/12/2010

Segnala al moderatore
Postato alle 5:16
Martedì, 07/12/2010
Salve a tutti, Mi chiamo Aleksi e ho un piccolo problemi con un programma scritto in C che sostanzialmente dovrebbe creare un demone che accetta connessioni su una determinata porta e quindi fa gestire la connessione a un processo figlio.

Quando il figlio è terminato però, vorrei che il padre lo chiudesse ma senza che smetta di accettare connessioni... Eccovi il codice:
Codice sorgente - presumibilmente C++

  1. #include <unistd.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <stdlib.h>
  8.  
  9. FILE *fd;
  10.  
  11.  
  12.  
  13. int main(void)
  14. {
  15.     pid_t demone, sid;
  16.     fd=fopen("game.log","a");
  17.     /*Controllo file di configurazione*/
  18.     /*...*/
  19.     /* Creazione Demone*/
  20.     demone = fork();
  21.     if(demone==0) {
  22.       sid = setsid();
  23.       if(sid < 0) {
  24.         printf("Errore nel settaggio dell'id di sistema");
  25.         exit(-1);
  26.       }
  27.     }
  28.     else if(demone < 0) {
  29.            printf("Errore nella crezione del demone");
  30.            exit(-1);
  31.     }
  32.     else {
  33.            /* Demone creato con successo */
  34.            printf("Demone con id %d creato\n",demone);
  35.            exit(0);
  36.     }
  37.  
  38.     umask(0);
  39.  
  40.     /*Chiusura files relativi al programma*/
  41.     close(STDIN_FILENO);
  42.     close(STDOUT_FILENO);
  43.     close(STDERR_FILENO);
  44.  
  45.  
  46.     struct sockaddr_in target;
  47.         memset(&target, 0, sizeof(target));
  48.  
  49.         if (-1 == (inet_aton("0.0.0.0", (struct in_addr *) (&target.sin_addr))) )
  50.         {
  51.          fprintf(fd,"Error: invalid IP address!");fflush(fd);
  52.          exit(1);
  53.         }
  54.         target.sin_family = AF_INET;
  55.         target.sin_port = htons(4000);
  56.         int sock;
  57.         fprintf(fd,"Creazione del socket sull'ip 0.0.0.0 alla porta 4000\n");fflush(fd);
  58.         if (-1 == (sock = socket(AF_INET, SOCK_STREAM, 0)))
  59.         {
  60.          fprintf(fd,"Errore: Impossibile Creare il Socket!\n");fflush(fd);
  61.          exit(1);
  62.         }
  63.         //fprintf(fd,"Socket Creato. Bindaggio...\n");fflush(fd);
  64.         if (-1 == (bind(sock, (struct sockaddr *) &target, sizeof(target))))
  65.         {
  66.          fprintf(fd,"Errore: Impossibile Bindare il Socket!\n");fflush(fd);
  67.          exit(1);
  68.         }
  69.         //fprintf(fd,"Eseguito\n");fflush(fd);
  70.         //fprintf(fd,"Attendendo nuove connessioni\n");fflush(fd);
  71.         if (-1 == (listen(sock, 1)))
  72.         {
  73.          fprintf(fd,"Errore: Impossibile Settare Socket in Ascolto!!\n");fflush(fd);
  74.          exit(1);
  75.         }
  76.         while(1)
  77.         {
  78.           int newSock, acceptedLen,pid;
  79.           struct sockaddr_in accepted;
  80.           if (-1 == (newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen)))
  81.           {
  82.             fprintf(fd,"Errore: Impossibile accettare la nuova connessione!!\n");fflush(fd);
  83.             close(newSock);
  84.             exit(1);
  85.           }
  86.           if ((pid=fork()) <0) {
  87.             fprintf(fd,"Errore nella fork\n");fflush(fd);
  88.             exit(-1);
  89.           }
  90.           if(pid==0) {
  91.             sonsid=setsid();
  92.             if(sonsid<0) {
  93.               fprintf(fd,"Errore: Impossibile assegnare un'id di sistema al figlio");fflush(fd);
  94.               exit(-1);
  95.             }
  96.             int lng = 0,i,f,j;
  97.             #define SIZE 50
  98.             char buffer[SIZE];
  99.             read(newSock, buffer, SIZE);
  100.             fprintf(fd,"Bytes ricevuti: %s \n",buffer);fflush(fd);
  101.             exit(0);
  102.           }
  103.  
  104.           close(newSock);
  105.         }
  106.         fclose(fd);
  107.       return 0;
  108. }



Sapete dirmi se c'è un modo migliore per gestire le connessioni o come posso risolvere il mio problema utilizzando questo sistema? Grazie

PM Quote
Avatar
Numa Pompilio (Ex-Member)
Pro


Messaggi: 66
Iscritto: 03/05/2010

Segnala al moderatore
Postato alle 9:43
Martedì, 07/12/2010
Testo quotato

Postato originariamente da Alexi:

Salve a tutti, Mi chiamo Aleksi e ho un piccolo problemi con un programma scritto in C che sostanzialmente dovrebbe creare un demone che accetta connessioni su una determinata porta e quindi fa gestire la connessione a un processo figlio.

Quando il figlio è terminato però, vorrei che il padre lo chiudesse ma senza che smetta di accettare connessioni... Eccovi il codice:
Codice sorgente - presumibilmente C++

  1. #include <unistd.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <stdlib.h>
  8.  
  9. FILE *fd;
  10.  
  11.  
  12.  
  13. int main(void)
  14. {
  15.     pid_t demone, sid;
  16.     fd=fopen("game.log","a");
  17.     /*Controllo file di configurazione*/
  18.     /*...*/
  19.     /* Creazione Demone*/
  20.     demone = fork();
  21.     if(demone==0) {
  22.       sid = setsid();
  23.       if(sid < 0) {
  24.         printf("Errore nel settaggio dell'id di sistema");
  25.         exit(-1);
  26.       }
  27.     }
  28.     else if(demone < 0) {
  29.            printf("Errore nella crezione del demone");
  30.            exit(-1);
  31.     }
  32.     else {
  33.            /* Demone creato con successo */
  34.            printf("Demone con id %d creato\n",demone);
  35.            exit(0);
  36.     }
  37.  
  38.     umask(0);
  39.  
  40.     /*Chiusura files relativi al programma*/
  41.     close(STDIN_FILENO);
  42.     close(STDOUT_FILENO);
  43.     close(STDERR_FILENO);
  44.  
  45.  
  46.     struct sockaddr_in target;
  47.         memset(&target, 0, sizeof(target));
  48.  
  49.         if (-1 == (inet_aton("0.0.0.0", (struct in_addr *) (&target.sin_addr))) )
  50.         {
  51.          fprintf(fd,"Error: invalid IP address!");fflush(fd);
  52.          exit(1);
  53.         }
  54.         target.sin_family = AF_INET;
  55.         target.sin_port = htons(4000);
  56.         int sock;
  57.         fprintf(fd,"Creazione del socket sull'ip 0.0.0.0 alla porta 4000\n");fflush(fd);
  58.         if (-1 == (sock = socket(AF_INET, SOCK_STREAM, 0)))
  59.         {
  60.          fprintf(fd,"Errore: Impossibile Creare il Socket!\n");fflush(fd);
  61.          exit(1);
  62.         }
  63.         //fprintf(fd,"Socket Creato. Bindaggio...\n");fflush(fd);
  64.         if (-1 == (bind(sock, (struct sockaddr *) &target, sizeof(target))))
  65.         {
  66.          fprintf(fd,"Errore: Impossibile Bindare il Socket!\n");fflush(fd);
  67.          exit(1);
  68.         }
  69.         //fprintf(fd,"Eseguito\n");fflush(fd);
  70.         //fprintf(fd,"Attendendo nuove connessioni\n");fflush(fd);
  71.         if (-1 == (listen(sock, 1)))
  72.         {
  73.          fprintf(fd,"Errore: Impossibile Settare Socket in Ascolto!!\n");fflush(fd);
  74.          exit(1);
  75.         }
  76.         while(1)
  77.         {
  78.           int newSock, acceptedLen,pid;
  79.           struct sockaddr_in accepted;
  80.           if (-1 == (newSock = accept(sock, (struct sockaddr *) &accepted, &acceptedLen)))
  81.           {
  82.             fprintf(fd,"Errore: Impossibile accettare la nuova connessione!!\n");fflush(fd);
  83.             close(newSock);
  84.             exit(1);
  85.           }
  86.           if ((pid=fork()) <0) {
  87.             fprintf(fd,"Errore nella fork\n");fflush(fd);
  88.             exit(-1);
  89.           }
  90.           if(pid==0) {
  91.             sonsid=setsid();
  92.             if(sonsid<0) {
  93.               fprintf(fd,"Errore: Impossibile assegnare un'id di sistema al figlio");fflush(fd);
  94.               exit(-1);
  95.             }
  96.             int lng = 0,i,f,j;
  97.             #define SIZE 50
  98.             char buffer[SIZE];
  99.             read(newSock, buffer, SIZE);
  100.             fprintf(fd,"Bytes ricevuti: %s \n",buffer);fflush(fd);
  101.             exit(0);
  102.           }
  103.  
  104.           close(newSock);
  105.         }
  106.         fclose(fd);
  107.       return 0;
  108. }



Sapete dirmi se c'è un modo migliore per gestire le connessioni o come posso risolvere il mio problema utilizzando questo sistema? Grazie



Dovresti gestire il padre con l'if(pid>0)

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 21:39
Martedì, 07/12/2010
Testo quotato

Postato originariamente da Alexi:

Salve a tutti, Mi chiamo Aleksi e ho un piccolo problemi con un programma scritto in C che sostanzialmente dovrebbe creare un demone che accetta connessioni su una determinata porta e quindi fa gestire la connessione a un processo figlio.

Quando il figlio è terminato però, vorrei che il padre lo chiudesse ma senza che smetta di accettare connessioni... Eccovi il codice:
Codice sorgente - presumibilmente Plain Text

  1. ...


Sapete dirmi se c'è un modo migliore per gestire le connessioni o come posso risolvere il mio problema utilizzando questo sistema? Grazie



non è che hai le idee un po' confuse? il padre è già stato terminato, il codice sotto è quello del figlio, che in questo caso è un demone.
Se vuoi che continui ad accettare connessioni non basta togliere l'exit(0); dal while?
Testo quotato

Postato originariamente da Numa Pompilio:
Dovresti gestire il padre con l'if(pid>0)


della serie consigli inutili :rotfl: usate la testa ragazzi, i codici non devono essere tutti identici

Ultima modifica effettuata da lumo il 07/12/2010 alle 21:43
PM Quote
Avatar
Alexi (Normal User)
Newbie


Messaggi: 2
Iscritto: 07/12/2010

Segnala al moderatore
Postato alle 21:43
Martedì, 07/12/2010
si beh ma il padre crea un figlio, e quando il figlio riceve una connessione si crea un "nipote" che la gestisce... questa era la mia idea... solo non posso mettere in wait il figlio, quando ci saranno altre connessioni in arrivo...

PM Quote
Avatar
Numa Pompilio (Ex-Member)
Pro


Messaggi: 66
Iscritto: 03/05/2010

Segnala al moderatore
Postato alle 22:20
Martedì, 07/12/2010
Testo quotato

Postato originariamente da lumo:
della serie consigli inutili :rotfl: usate la testa ragazzi, i codici non devono essere tutti identici



Questa non l'ho capita....

PM Quote
Avatar
Numa Pompilio (Ex-Member)
Pro


Messaggi: 66
Iscritto: 03/05/2010

Segnala al moderatore
Postato alle 22:23
Martedì, 07/12/2010
Testo quotato

Postato originariamente da Numa Pompilio:

Testo quotato

Postato originariamente da lumo:
della serie consigli inutili :rotfl: usate la testa ragazzi, i codici non devono essere tutti identici



Questa non l'ho capita....

p.s. Meno presunzione...meno presunzione. Ne avete ancora da imparare


PM Quote