Non ho modo di provare quel codice perché non ho barcode, ma vedo comunque alcune cose strane... innanzitutto, tra le ultime righe del programma richiami execl(), che è diversa da execlp(): a quest'ultima non hai bisogno di passare il path completo del comando/programma (il sistema lo ricerca automaticamente nelle directory del tuo PATH, come la "p" del nome della funzione ricorda). La execl() invece necessita del path completo del comando, qundi scrivere solo "convert" non va bene...
Inoltre fai un uso scorretto di popen(): questa funzione non è come una fork(), non devi differenziare tra processo padre e figlio con il costrutto if - then - else... la popen crea un processo eseguendo il comando/programma che le passi, scrive l'output su uno stream di cui restituisce il puntatore come valore di ritorno e chiude subito il processo. Dopo la chiamata popen(), puoi servirti di quello che è stato scritto per compiere altre operazioni.
Questo è un esempio di utilizzo... il programma richiama ls con popen, l'output viene scritto su un file (lsfile) e questo viene poi ordinato da sort. Ho lasciato execl(), specificando però il path completo del comando.
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <errno.h> int main(void) { int byte; char *output = "lsfile"; FILE *my_pipe, *fp; pid_t pid; if( ( my_pipe = popen("ls", "r") ) == NULL ) { fprintf(stderr, "An error has occurred with popen(): %s\n", strerror(errno)); exit(errno); } fp = fopen(output, "w"); if ( fp == NULL ) { fclose(my_pipe); fprintf(stderr, "Unable to open %s: %s\n", output, strerror(errno)); exit(errno); } while ( ( byte = fgetc(my_pipe) ) != EOF ) /* Copia dalla pipe al file */ fputc(byte ,fp); fclose(fp); fclose(my_pipe); /* la creazione di un nuovo processo per eseguire sort non è necessaria */ pid = fork(); if ( pid < 0 ) { fprintf(stderr, "An error has occurred with fork(): %s\n", strerror(errno)); exit(errno); } if ( pid == 0 ) { execl("/usr/bin/sort", "sort", output, NULL); fprintf(stderr, "An error has occurred with execlp(): %s\n", strerror(errno)); exit(errno); } waitpid(pid, NULL, 0); return 0; }

Rispondi quotando