Linux Popen System Call in C

Linux Popen System Call In C



La funzione popen() eseguirà il comando dato dal comando della stringa. La funzione dovrebbe restituire un puntatore a un flusso utilizzato per leggere o scrivere nella pipe, creando anche una pipe tra l'applicazione chiamante e il comando eseguito. La funzione Popen è disponibile nella libreria standard della funzione I/O e genera un secondo processo per eseguire un comando da terminale. La fase aperta di popen() è la stessa della fase aperta nella funzione fopen(). La funzione popen() avvia un processo fork, costruendo una pipe ed eseguendo la shell. Poiché una pipe è unidirezionale per impostazione predefinita; di conseguenza, il flusso è di sola lettura o di sola scrittura. Sull'esecuzione riuscita della funzione popen(), si ottiene un flusso aperto che viene utilizzato per la lettura e la scrittura della pipe.

Esempio 1

Con il seguente programma di esempio, leggeremo i file che esistono nella directory o cartella corrente utilizzando la chiamata di sistema popen. Innanzitutto, abbiamo inserito il file di intestazione stdio.h della libreria C standard. Quindi, abbiamo una funzione int main() del programma in cui abbiamo distribuito la funzione popen. Prima di questo, abbiamo stabilito la variabile puntatore 'FileOpen' dalla classe 'FILE'. La variabile puntatore del file indica il byte successivo da leggere o scrivere.







Successivamente, abbiamo assegnato il valore limite del personaggio da leggere. La variabile 'FileOpen' ha quindi invocato la funzione 'popen'. La funzione 'popen' accetta il comando 'ls -l' di Linux, che elencherà tutti i file della directory corrente. Inoltre, abbiamo inserito nella funzione popen il parametro “r”, che indica la modalità di lettura.



Qui, abbiamo reindirizzato il processo di lettura dei file utilizzando la funzione popen. Successivamente, abbiamo elaborato la pipe creata con il ciclo while. Il ciclo while utilizza i metodi fgets, che accettano gli argomenti 'line', 'sizeof the line' e 'FileOpen'. I fget leggono il processo convogliato e lo memorizzano nel simbolo '%s' della stringa. Questo particolare simbolo viene chiamato all'interno del metodo printf insieme all'argomento 'line'. Una volta che abbiamo creato la pipe elaborata, con la funzione pclosed, il processo con pipe può essere chiuso come distribuito alla fine del programma seguente.



#include


int principale ( )

{

FILE * FileApri;

linea di caratteri [ 130 ] ;


FileApri = apri ( 'ls -l' , 'r' ) ;

mentre ( fget ( linea, dimensione della linea, FileOpen ) )

{

stampa f ( '%S' , linea ) ;

}

pclose ( FileApri ) ;

}





La funzione popen del programma C ha biforcato il processo sopra e quindi ha creato la pipe. Ora, abbiamo eseguito la pipe elaborata dello stream nella shell con il comando di compilazione C. L'output ha elencato tutti i file nella directory 'Home' poiché abbiamo eseguito il programma in quella directory.



Esempio 2

Nel precedente programma popen, abbiamo una semplice dimostrazione della funzionalità del programma popen che viene utilizzato per eseguire il piping del processo di streaming di lettura dei file. Ora, abbiamo preso un altro esempio della funzione popen in cui abbiamo reindirizzato il processo con la modalità di scrittura. Consideriamo il programma con la funzione principale. Abbiamo costruito la variabile del puntatore del file all'interno della funzione principale come 'file'. Il puntatore al file viene distribuito con la funzione popen.

La funzione popen accetta il comando 'cat' e la 'w' per la modalità di scrittura. Qui, ogni argomento File viene letto in sequenza e inviato allo standard output dal comando cat. Nel corpo del ciclo for, abbiamo utilizzato la funzione fprintf per stampare i valori di conteggio numerico poiché abbiamo specificato il simbolo “%d”. Quindi chiuso, il processo popen pipe con la chiamata di sistema pclose.

#include


int principale ( int argc, char ** argv ) {

FILE * file = papa ( 'gatto' , 'in' ) ;

int x = 0 ;


per ( X = 0 ;X < 5 ;x++ ) {


fprintf ( file , 'Il mio conteggio = %d \n ' , X ) ;
}

pclose ( file ) ;

Restituzione 0 ;

}

Quando abbiamo eseguito il processo sopra creato, ha stampato i valori di conteggio nel modo seguente.

Esempio 3

Ora abbiamo un altro programma che trasferisce i dati di un processo a un altro processo. Lo faremo con la pipe dalla funzione pop. Abbiamo implementato il programma utilizzando le librerie standard di C. Quindi, abbiamo una funzione int main per distribuire un programma. Qui, abbiamo specificato la stringa nella funzione sprintf con l'argomento 'buffer'. La funzione sprintf() mantiene il risultato nel buffer char fornito da sprintf invece di inviarlo al prompt.

Successivamente, abbiamo chiamato la funzione popen all'interno della variabile 'read'. Lì, abbiamo due processi all'interno della funzione popen. Il 'wc -c' è il primo processo utilizzato per contare i caratteri forniti e il secondo processo è il 'w', che indica che la pipe è aperta in modalità di scrittura. Successivamente, abbiamo la funzione 'fwrite' che utilizza la pipe per scrivere i dati. I dati verranno ricevuti dal “wc”, quindi conteggiato il carattere e visualizzato nella shell.

#include

#include

#include

#include

int principale ( )

{

FILE * leggere ;

buffer di caratteri [ cinquanta ] ;

sprintf ( respingente, 'Chiamata di sistema Linux' ) ;

leggere = papa ( 'wc -c' , 'in' ) ;

fscrivi ( buffer, sizeof ( car ) , strlen ( respingente ) , leggere ) ;

pclose ( leggere ) ;

}

I caratteri visualizzati nel prompt sono '17' perché la stringa che abbiamo specificato sopra contiene '17' caratteri. Il processo 'wc -c' legge questi caratteri e li stampa come output.

Esempio 4

L'esempio sopra di pope invia i dati da un processo a un altro. Qui riceveremo i dati da un processo all'altro tramite una pipe. La funzione principale del programma è costruire il buffer, che accetta valori “50”. Quindi, abbiamo creato la variabile 'r', in cui la funzione pop ha creato il processo. Il processo 'ls' viene utilizzato per elencare i file della directory e il processo 'r' per leggere i dati dalla pipe. Il processo 'ls' trasmette i dati al processo 'r' per la lettura. Dopo questo, abbiamo la funzione fread, che legge i dati e memorizza i dati nel buffer. Quindi, l'istruzione print stamperà i dati memorizzati nel buffer.

#include

#include

#include

#include

int principale ( )

{

FILE * r;

buffer di caratteri [ cinquanta ] ;


r = papa ( 'l' , 'r' ) ;

fread ( respingente, 1 , 25 , r ) ;


stampa f ( '%S \n ' , respingente ) ;

pclose ( r ) ;

}

Qui vengono visualizzati solo '50' caratteri dei file esistenti dalla directory di lavoro. Pertanto, l'output avrà solo 50 caratteri.

Conclusione

Abbiamo fornito una dimostrazione dettagliata delle chiamate di sistema popen di Linux in linguaggio C. Abbiamo implementato quattro esempi in cui abbiamo implementato la funzione popen. La funzione popen restituisce il flusso di pipe in base alla modalità che abbiamo assegnato. Negli esempi, abbiamo utilizzato sia la modalità di lettura che quella di scrittura con le funzioni di gestione dei file fread e fwrite. Abbiamo usato il nome del programma nella funzione popen() come primo argomento. Il secondo argomento è un file “r” come lettura o “w” come modalità di scrittura.