Newsgroup: it.comp.os.linux.iniziare
Titolo: Che significa "segmentation fault"

Sono alle prime armi con la programmazione in rete:
sto cercando di eseguire due programmi semplici
scaricati dalla rete:
-----------------------------------------------------------
Processo Server:
-----------------------------------------------------------
1 # include <sys/ types .h > /* predefined types */
2 # include < unistd .h > /* include unix standard library */
3 # include < arpa / inet .h > /* IP addresses conversion utililites */
4 # include <sys/ socket .h > /* socket library */
5 # include < stdio .h > /* include standard I/O library */
6 # include < time .h>
7
8 int main (int argc , char * argv [])
9 {
10 int list_fd , conn_fd ;
11 int i;
12 struct sockaddr_in serv_add , client ;
13 char buffer [ MAXLINE ];
14 socklen_t len;
15 time_t timeval ;
16 pid_t pid;
17 int logging =0;
18
19 /* write daytime to client */
20 while (1) {
21   len = sizeof ( client );
22   if ( ( conn_fd = accept ( list_fd , ( struct sockaddr *)& client , &
len ))
23   <0 ) {
24   perror (" accept   error ");
25   exit ( -1);
26 }
27 /* fork to handle connection */
28 if ( ( pid = fork ()) < 0 ){
29   perror (" fork   error ");
30   exit ( -1);
31 }
32 if ( pid == 0) { /* child */
33   close ( list_fd );
34   timeval = time ( NULL );
35   snprintf (buffer , sizeof ( buffer ), " %.24 s\r\n" , ctime (&
timeval ));
36   if ( ( write ( conn_fd , buffer , strlen ( buffer ))) < 0 ) {
37    perror (" write   error ");
38    exit ( -1);
39   }
40   if ( logging ) {
41    inet_ntop ( AF_INET , & client . sin_addr , buffer , sizeof (
buffer ));
42    printf (" Request   from   host  %s ,  port  %d\n" , buffer ,
43    ntohs ( client . sin_port ));
44   }
45   close ( conn_fd );
46   exit (0);
47 } else { /* parent */
48   close ( conn_fd );
49  }
50 }
51 /* normal exit , never reached */
52 exit (0);
53 }
-----------------------------------------------------
Processo Client:
-----------------------------------------------------
1 # include <sys/ types .h > /* predefined types */
2 # include < unistd .h > /* include unix standard library */
3 # include < arpa / inet .h > /* IP addresses conversion utilities */
4 # include <sys/ socket .h > /* socket library */
5 # include < stdio .h > /* include standard I/O library */
6
7 int main (int argc , char * argv [])
8 {
9 int sock_fd ;
10 int i , nread ;
11 struct sockaddr_in serv_add ;
12 char buffer [ MAXLINE ];
13 ...
14 /* create socket */
15 if ( ( sock_fd = socket ( AF_INET , SOCK_STREAM , 0)) < 0) {
16 perror (" Socket   creation   error ");
17 return -1;
18 }
19 /* initialize address */
20 memset (( void *) & serv_add , 0 , sizeof ( serv_add )); /* clear server
address */
21 serv_add . sin_family = AF_INET ; /* address type is INET */
22 serv_add . sin_port = htons (13); /* daytime post is 13 */
23 /* build address using inet_pton */
24 if ( ( inet_pton ( AF_INET , argv [ optind ] , & serv_add . sin_addr ))
<= 0) {
25 perror (" Address   creation   error ");
26 return -1;
27 }
28 /* extablish connection */
29 if ( connect ( sock_fd , ( struct sockaddr *)& serv_add , sizeof (
serv_add )) < 0) {
30 perror (" Connection   error ");
31 return -1;
32 }
33 /* read daytime from server */
34 while ( ( nread = read ( sock_fd , buffer , MAXLINE )) > 0) {
35 buffer [ nread ]=0;
36 if ( fputs (buffer , stdout ) == EOF ) { /* write daytime */
37 perror (" fputs   error ");
38 return -1;
39 }
40 }
41 /* error on read */
42 if ( nread < 0) {
43 perror (" Read   error ");
44 return -1;
45 }
46 /* normal exit */
47 return 0;
48 }
_______________________________________________________________
Entrambi i processi vengono compilati da gcc normalmente.
Per quanto riguarda l'esecuzione il server sembra funzionare correttamente,
infatti,
una volta mandato in esecuzione, si avvia mettendosi in attesa di richieste
del client.
Chi dà problemi è il processo client che, una volta avviato, mi fa ritornare
il messaggio
in oggetto: "segmentation fault".
Sapete spiegarmi che succede e come provvedere a risolvere il problema?
Grazie a chi vorrà aiutarmi.
    Gianluca
Togliete BLABLA per rispondere privatamente



 Sapete spiegarmi che succede e come provvedere a risolvere il problema?
Segfault significa: stai tentando di scrivere della memoria che non
hai allocato o di disallocare della memoria che non hai allocato.
In sostanza e' un problema di gestione della memoria.
Davide
-- 
| Just because you're paranoid doesn't mean they AREN'T after you. 
| 
| 
| 

 Sapete spiegarmi che succede e come provvedere a risolvere il problema?
Toh, una volta tanto che bisogna spostare qualcuno da ICOLI ;-) Passa al
gruppo it.comp.os.linux.development.
Il messaggio in oggetto significa che un puntatore che e` usato nel
programma e` andato a leggere o scrivere in una posizione di memoria non
valida, quindi il programma ha eseguito un'operazione non valida e deve
essere terminato[1]. Controlla i puntatori, e gli array che sono puntatori
anche quelli.
Palantir
[1] Non mi giunge nuova, questa frase... come mai? ;-P
-- 
Palantir
icq:57482808 --- Per scrivermi in priv togli quello che va tolto

 [1] Non mi giunge nuova, questa frase... come mai? ;-P
E ci ho anche azzeccato: Microsoft Outlook Express 6.00.2800.1106
inconfondibile quando c'e` da spedire in giro messaggi doppi!
