|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
[C] Problema exec + tar
Salve a tutti
dunque ciò che voglio fare è semplice: in un programma C che gira su un sistema Unix-like voglio creare un archivio compresso con il contenuto di una directory (contenuto variabile, che non so a priori). Ora dal terminale ho visto che basta fare (supponiamo di essere già dentro la directory): tar -czf nome_archivio * Pertanto, nel mio programma, dopo la fork faccio: Codice:
execlp ("tar", "tar", "--exclude", nome_archivio_ext, "-cvzf", nome_archivio_ext, "*", NULL); tar: *: funzione "stat" non riuscita: File o directory non esistente tar: Uscita con stato di fallimento in base agli errori precedenti Ora provando e riprovando, ho notato che scrivendo: Codice:
execlp ("tar", "tar", "--exclude", nome_archivio_ext, "-cvzf", nome_archivio_ext, ".", NULL); Però in questo modo, quando apro l'archivio compresso vi è una cartella . , dentro la quale ci sono i giusto file. Qualcuno sa dirmi per quale motivo non funziona con l'* ??? ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
con la system non riesci a lanciare quel comando??
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
![]()
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Da man bash
Codice:
Pathname Expansion After word splitting, unless the -f option has been set, bash scans each word for the characters *, ?, and [. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern. Con system funziona perché viene invocata una shell per eseguire il comando (/bin/sh -c COMANDO), quindi viene correttamente eseguito il pathname expansion prima del lancio del comando con i parametri espansi.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Quote:
paura, non lo sapevo :P Ma quindi non c'è soluzione? (cioè oltre ad usare la system). Oppure ci devo mettere un carattere di escape? |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
che stile, non lo sapevo neanche io...
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
l'unico modo è la system, oppure si può ovviamente usare una libreria per la compressione |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Niente escape, come scritto da pabloski o si usa system o si deve fare prima una lista completa dei file che si desidera passare al comando.
Ottenere una lista completa del contenuto del primo livello di una directory in C/C++ liscio non è una cosa immediata, anche se non esageratamente complicato. Esempio C che non mi sembra malaccio. Esempi C++. Il passaggio successivo, come già accennato, potrebbe essere l'utilizzo della lib. Questo approccio da un controllo assoluto del processo di compressione, permettendo di fare test specifici sui singoli file da comprimere, dando la possibilità, se necessario, di pre-elaborarli/post-elaborarli singolarmente, ecc... Questo ha naturalmente il costo di una discreta quantità di righe di codice in più da scrivere e la necessità di familiarizzare con l'api della libreria (tieni conto che una volta che se ne comprende la logica questa sarà molto simile in molte altre librerie di compressione, salvo nomi di funzioni differenti e qualche parametro qua e là).
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 304
|
Grazie a tutti per le risposte. Penso che utilizzerò la system, perchè mi sembra la cosa più semplice da fare.
Ah una piccola domanda: la system funziona con FreeBSD? (il mio programma deve girare su FreeBSD) |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Tutti i sistemi conformi allo standard POSIX.1-2001 devono provvedere un'interfaccia ad una shell invocabile.
FreeBSD (come GNU/Linux) non è completamente conforme a questo standard, ma ho visto che all'interno della sua BSD libc la funzione system è definita come nello standard e, stando ai commenti ed allo storico del csv, c'è almeno dal 1988.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:10.