Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Cos'è la bolla dell'IA e perché se ne parla
Cos'è la bolla dell'IA e perché se ne parla
Si parla molto ultimamente di "bolla dell'intelligenza artificiale", ma non è sempre chiaro perché: l'IA è una tecnologia molto promettente e che ha già cambiato molte cose dentro e fuori le aziende, ma ci sono enormi aspettative che stanno gonfiando a dismisura i valori delle azioni e distorcendo il mercato. Il che, com'è facile intuire, può portare a una ripetizione della "bolla dotcom", e forse anche di quella dei mutui subprime. Vediamo perché
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-01-2007, 18:53   #1
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
[C] Segmentation fault

Ciao.

Potreste aiutarmi a scovare l'errore in queste due (o in una di queste due funzioni) ? La funzione intepret_file legge da un file una linea di testo che corrisponde ad un comando Unix e sostituisce gli argomenti $i con gli argomenti passati a linea di comando. La funzione parse invece esegue tutte le operazioni di shell expansion. Ho provato con un file di prova contenente tre linee:

ls $1 $4
ps $3
uname $2

dove $1="-l" $2="*.c" $3="aux" $4="-r".

Il problema avviene quando va a leggere la terza linea e chiama la funzione parse. Verso la fine nel while(cnt<pwordexp.we_wordc) va in segmentation fault sull'istruzione "args[i]=(char *)calloc(strlen(pwordexp.we_wordv[i-2])+1,sizeof(char));" (nonostante args[i]=NULL). Non riesco a capire perché. Questo è il codice delle due funzioni:

interpret_file.c
Codice:
#include "functions.h"

void interpret_file(int numargs,char **args){
   int fdin,i,j,status,offset;
   pid_t pid;
   ssize_t nread;
   char *buf=(char *)malloc(sizeof(char)*MAX_CMD_LEN);
   if((fdin=open(args[1],O_RDONLY)) == -1){
      if(errno==EINTR){
         if(buf!=NULL){
            free(buf);
            buf=NULL;
         }
         close(fdin);
         exit(OK);
      }
      else{
         perror("open error");
         if(buf!=NULL){
            free(buf);
            buf=NULL;
         }
         close(fdin);
         exit(OPEN_ERR);
      }
   }
   while((nread=read(fdin,buf,MAX_CMD_LEN)) > 0 || nread == -1){
      char **passargs=(char **)calloc(MAX_ARGS,sizeof(char *));
      if(nread == -1){
         if(errno==EINTR){
            if(buf!=NULL){
               free(buf);
               buf=NULL;
            }
            close(fdin);
            exit(OK);
         }
         else{
            perror("read error");
            if(buf!=NULL){
               free(buf);
               buf=NULL;
            }
            close(fdin);
            exit(OPEN_ERR);
         }
      }
      j=0;
      offset=0;
      char *pbuf=buf;
      if(nread < MAX_CMD_LEN){
         if(errno==EINTR){
            if(buf!=NULL){
               free(buf);
               buf=NULL;
            }
            close(fdin);
            exit(OK);
         }
         else{
            perror("read error");
            if(buf!=NULL){
               free(buf);
               buf=NULL;
            }
            close(fdin);
            exit(READ_ERR);
         }
      }
      while(*pbuf != '$'){
         ++pbuf;
         ++offset;
      }
      passargs[j]=(char *)calloc(offset,sizeof(char));
      strncpy(passargs[j],buf,offset-1);
      passargs[offset]='\0';
      ++j;
      for( ; *pbuf=='$'; pbuf+=2){
            ++pbuf;
         switch(*pbuf){
            case '1':
               i=2;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            case '2':
               i=3;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            case '3':
               i=4;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            case '4':
               i=5;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            case '5':
               i=6;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            case '6':
               i=7;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            case '7':
               i=8;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            case '8':
               i=9;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            case '9':
               i=10;
               passargs[j]=(char *)calloc(strlen(args[i]),sizeof(char));
               strcpy(passargs[j],args[i]);
               ++j;
               break;
            default:
               printf("Too many arguments\n");
               if(buf!=NULL){
                  free(buf);
                  buf=NULL;
               }
               if(passargs!=NULL){
                  free(passargs);
                  passargs=NULL;
               }
               exit(ERR_GEN);
            }
      }
      parse(NULL,passargs);
      if((pid=fork()) < 0){
        perror("fork error");
         if(passargs!=NULL){
            free(passargs);
            passargs=NULL;
         }
         if(buf!=NULL){
            free(buf);
            buf=NULL;
         }
         exit(FORK_ERR);
      }
      if(pid == 0){
         execvp(passargs[0],passargs);
         perror("exec failed");
         if(passargs!=NULL){
            free(passargs);
            passargs=NULL;
         }
         if(buf!=NULL){
            free(buf);
            buf=NULL;
         }
         exit(EXEC_ERR);
      }
      if(pid > 0){
         if (waitpid(pid,&status,0) == -1){
            if(errno!=EINTR){
               perror("waitpid error");
               if(passargs!=NULL){
                  free(passargs);
                  passargs=NULL;
               }
               if(buf!=NULL){
                  free(buf);
                  buf=NULL;
               }
            exit(WAIT_ERR);
            }
            else{
               kill(pid,SIGTERM);
               do{
                  if (waitpid(pid,&status,0) != -1)
                  break;
               }while(errno==EINTR);
            }
         }
      }
      if(passargs!=NULL){
         free(passargs);
         passargs=NULL;
      }
   }
   close(fdin);
   if(buf!=NULL){
        free(buf);
        buf=NULL;
   }
}
parse.c
Codice:
#include "functions.h"

void parse(char *name, char **args){
   int i=0,j=0,cnt=0;
   char *s;
   if(args[i] == NULL)
      args[i]=(char *)malloc(sizeof(char)*COMM_LENGTH+1);
   if (strtok(name," ") != NULL){
      strcpy(args[i],name);
      ++i;
   }
   while((s=strtok(NULL," ")) != NULL){
      args[i]=(char *)malloc(sizeof(char)*strlen(s)+1);
      sprintf(args[i],"%s",s);
      ++i;
   }
   if(args[i] == NULL)
      args[i]=NULL;
   if(s!=NULL){
      free(s);
      s=NULL;
   }
   int ret;
   i=1;
   while(args[i] != NULL){
      if(*args[i] == '-'){ 
         ++i;
         ++j;
         continue;
      }
      if ((ret=wordexp(args[i],&pwordexp,0)) == 0)
         ++i;
      else{
         printf("wordexp error");
         if(args!=NULL){
            free(args);
            args=NULL;
         }
         exit(WRDEXP_ERR);
      }
   }
   if(j>0){
      i=j+1;
      while(cnt<pwordexp.we_wordc){
         if(args[i]==NULL)
            args[i]=(char *)calloc(strlen(pwordexp.we_wordv[i-2])+1,sizeof(char));
         strcpy(args[i],pwordexp.we_wordv[i-2]);
         ++cnt;
         ++i;
      }
   }
   args[i]=NULL;
   wordfree(&pwordexp);
}
Grazie.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2007, 22:31   #2
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Ho risolto. Praticamente era la variabile wordexp che non veniva inizializzata per quel comando nella funzione parse e naturalmente non riusciva ad allocare memoria. Grazie lo stesso.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2007, 09:15   #3
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
quando succedono queste cose perché non fai una bella strace (da quel che vedo al volo sei su linux, o sbaglio ? )

Codice:
strace -f -F -s 1024 -o file.trace ./<nome prog>
__________________
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2007, 11:17   #4
Manugal
Senior Member
 
L'Avatar di Manugal
 
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
Eh infatti cercavo un utility che mi facilitasse il compito. Grazie, ne terrò conto per il prossimo.
Manugal è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2007, 11:42   #5
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da Manugal
Eh infatti cercavo un utility che mi facilitasse il compito. Grazie, ne terrò conto per il prossimo.
di niente

l'alternativa é printf fino alla nausea
__________________
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
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
FRITZ!Repeater 1700 estende la rete super-veloce Wi-Fi 7 FRITZ!Repeater 1700 estende la rete super-veloce...
Weekend pre natalizio Amazon, ecco tutte...
Prezzi giù su Oral-B iO: spazzolini elet...
19.000 Pa a un prezzo senza precedenti: ...
Narwal in super offerta su Amazon: robot...
SK hynix e NVIDIA lavorano a un SSD spec...
Roborock in super offerta su Amazon: pre...
Dreame abbassa i prezzi su Amazon: robot...
ECOVACS Deebot torna protagonista su Ama...
Il primo iPhone pieghevole potrebbe esse...
Apple 'apre' iOS alle terze parti anche ...
Cloud sovrano: l'approccio di Broadcom c...
HONOR conferma l'arrivo in Italia di Mag...
La Cina sotto pressione impone maniglie ...
OpenAI integra le app in ChatGPT per tra...
NVIDIA sarebbe pronta a tagliare la prod...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:54.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v