Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [C] exec: errore

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9

    [C] exec: errore

    Salve, devo scrivere questo programma che mi comprima e decomprima dei file zip.
    Avendo installato 7-zip pensao di sfruttare la potente riga di comando facendo uso del comando exec
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <process.h>
    
    int main (){
    char *file="NomeFile.zip";
    	execlp("7z","7z","x",file,"-otemp",(char *)0);
    ...
    return 0;
    }
    in DOS (sono in ambiente windows) il comando sarebbe:

    7z x NomeFile.zip -otemp

    che mi decomprime il file NomeFile.zip nella cartella temp.

    Una volta compilato provo a lanciarlo ma qui si ferma (presumo che non trovi i file perchè 7-zip anche parte).
    Qualcuno mi può aiutare a capire come utilizzare il comando exec in maniera corretta?
    vi ringrazio tutti

  2. #2
    Al di là del fatto che sotto Windows non si usa la exec, ma la CreateProcess, probabilmente dipende dal fatto che non hai specificato il percorso di 7z.exe.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    Dunque, non vorrei sbagliarmi ma exec dovrebbe essere implementata sotto windows dalla chiamata di sistema <process.h> (correggimi se sbaglio)

    7z.exe inoltre lo trova e lo fa partire (ho inserito il path del prog. direttamente nelle variabili d'ambiente del sistema oparativo).

    Unico problema è che mi dice che l'archivio zip non esiste (cosa oviamente non vera).

    Suggerimenti??

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Il file NomeFile.zip dove si trova precisamente? Hai provato a specificarne il percorso completo?

    Comunque il modo con cui chiami execlp è corretto, sempre se come dici il percorso di 7z è nella variabile d'ambiente PATH...
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    Problema risolto. Non ho ben capito come ma sembra che al compilatore che uso non andasse bene come avevo dichiarato il nome del file.
    Con CHAR FILE[] al posto di CHAR *FILE ora funziona.

    Il problema ora è che qualsiasi comando ci sia sotto il execlp non viene riconosciuto e il programma si ferma (c'è un printf dopo e quindi mi dovrebbe scrivere una frase a video ma niente).

    Devo indicargli in qualche maniera che l'istruzione è terminata?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E' normale che dopo le istruzioni non vengano eseguite...

    Nel momento in cui avvii il tuo programma, con un po' di approssimazione si può dire che il sistema operativo crea un nuovo processo per eseguirlo e questo processo ha nel data text tutte le righe di codice macchina dell'eseguibile che hai lanciato, oltre che tutti i dati che hai definito (inizializzati e non). Nel momento in cui chiami execlp, tu stai sostituendo tutto il contenuto attuale del processo con una nuova "immagine", cioè con nuove righe di codice macchina, nuovi dati ecc... che sono quelli del programma che vuoi eseguire appunto con la chiamata a execlp, ma l'immagine del processo originario (cioè il programma scritto da te che lanci all'inizio) viene irrimediabilmente persa, quindi è ovvio che una volta conclusa l'esecuzione del programma 7z.exe le righe di codice successive alla execlp non vengano eseguite...

    Per risolvere, in Unix dovresti prima creare un nuovo processo con la fork() e poi chiamare exexlp(). In Windows non esiste la fork() ma che io sappia (come del resto diceva anche MItaly) si ricorre alla CreateProcess() la quale è una specie di fork() e exec() messe insieme, e anzi anche con qualcosa in più (tant'è che ha dieci parametri formali, come - secondo me - con celato disgusto fa notare Tanenbaum nel suo celebre libro "I moderni sistemi operativi" )
    every day above ground is a good one

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    Ok. Ho sostituito con CreateProcess:
    codice:
    CreateProcess(NULL,
    		"7z x NomeFile.zip -otemp",
    		NULL,
    		NULL,
    		FALSE,
    		0,
    		NULL,
    		NULL,
    		&si,&pi)
    ma non rieco a trovare nei manuali il modo di inserire la stringa del nome del file (che scrivo dopo uno scanf), sicchè 7z.exe mi dice che non trova l'archivio.

  8. #8
    Usa la snprintf per creare la linea di comando.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    9
    una volta creata la riga con snprintf
    codice:
    snprintf(scompatta,"7z x %s -otemp",file);
    non so come metterlo all'interno del CreateProcess la stringa "scompatta" affinchè esegua il comando....

  10. #10
    codice:
    CreateProcess(NULL,
    		scompatta,
    		NULL,
    		NULL,
    		FALSE,
    		0,
    		NULL,
    		NULL,
    		&si,&pi);

    Comunque nella chiamata a snprintf che hai scritto manca il secondo parametro (le dimensioni del buffer scompatta); se è allocato sullo stack puoi fare:
    codice:
    if(snprintf(scompatta,sizeof(scompatta),"7z x %s -otemp",file)==-1)
    {
        fputs("Buffer di dimensioni insufficienti",stderr);
        /* qui esci in qualche maniera */
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.