E 'cattiva pratica di utilizzare la funzione () quando le funzioni di libreria potrebbero essere utilizzati al posto del sistema? Perché?

StackOverflow https://stackoverflow.com/questions/509743

  •  21-08-2019
  •  | 
  •  

Domanda

dire che c'è un po 'di funzionalità necessarie per un'applicazione in fase di sviluppo che potrebbe essere raggiunto facendo una chiamata di sistema, o un programma a riga di comando o utilizzando una libreria. Assumendo l'efficienza non è un problema, è cattiva pratica di fare semplicemente una chiamata di sistema a un programma invece di utilizzare una libreria? Quali sono gli svantaggi di fare questo?

Per rendere le cose più concreto, un esempio di questo scenario sarebbe un programma che ha bisogno di scaricare un file da un server Web, sia il programma o la libreria cURL libcurl potrebbe essere utilizzato per questo.

È stato utile?

Soluzione

A meno che non si sta scrivendo il codice per un solo sistema operativo, non c'è modo di sapere se la vostra chiamata di sistema sarà anche il lavoro. Che cosa succede quando c'è un aggiornamento del sistema o l'aggiornamento di un sistema operativo?
Mai utilizzare una chiamata di sistema se non v'è una libreria per fare la stessa funzione.

Altri suggerimenti

Io preferisco le librerie a causa del problema di dipendenza, vale a dire l'eseguibile potrebbe non essere lì quando si chiama, ma la biblioteca sarà (supponendo che i riferimenti di libreria esterni vengono presi cura di quando il processo inizia sulla vostra piattaforma). In altre parole, utilizzando librerie sembrerebbe per garantire un più stabile, risultato prevedibile in più ambienti di chiamate di sistema avrebbe fatto.

Ci sono diversi fattori da prendere in considerazione. Una sola chiave è l'affidabilità del se il programma esterno sarà presente su tutti i sistemi in cui è installato il software. Se c'è una possibilità che verrà a mancare, allora forse è meglio farlo all'interno del vostro programma.

pesa contro di questo, si potrebbe prendere in considerazione che il codice in più caricata nel vostro programma è proibitivo - non è necessario il codice di pesantezza per una parte così raramente utilizzato dell'applicazione

.

La funzione di sistema () è conveniente, ma pericolosa, anche perché invoca una shell, di solito. Si può essere meglio chiamare il programma più direttamente - su Unix, tramite il fork () e chiamate di sistema exec (). [Si noti che una chiamata di sistema è molto diverso da chiamare la funzione system(), per inciso!] OTOH, potrebbe essere necessario preoccuparsi di garantire tutti i descrittori di file aperti nel programma sono chiusi - soprattutto se il vostro programma è una sorta di daemon in esecuzione su conto di altri utenti; che è meno di un problema se il tuo non si utilizza privilegi speciali, ma è ancora una buona idea di non dare l'accesso di programma invocato per qualsiasi cosa non si intendeva. Potrebbe essere necessario guardare la chiamata fcntl() sistema e la FD_CLOEXEC bandiera.

In generale, è più facile mantenere il controllo delle cose, se si costruisce la funzionalità nel vostro programma, ma non è una decisione banale.

La sicurezza è una preoccupazione. Un ricciolo malintenzionato potrebbe causare il caos nel vostro programma. Dipende se si tratta di un programma personale in cui la codifica la velocità è il vostro obiettivo principale, o di un'applicazione commerciale dove le cose come la sicurezza giocano un fattore.

chiamate di sistema sono molto più difficili da fare in tutta sicurezza.

Tutti i tipi di personaggi divertenti devono essere correttamente codificato per passare argomenti, e le tipologie di codifica possono variare a seconda della piattaforma o anche la versione del comando. Così facendo una chiamata di sistema che contiene tutti i dati degli utenti a tutti richiede un sacco di sanità mentale controllo ed è facile commettere un errore.

Si, come detto sopra, tenere a mente la differenza tra le chiamate di sistema (come fcntl () e open ()) e il sistema () chiama. :)

Nelle prime fasi di prototipazione di un programma C, faccio spesso chiamate esterne a programmi come grep e sed per la manipolazione dei file usando popen (). Non è sicuro, non è sicuro, e non è certamente portatile. Ma può permettere di andare avanti rapidamente. Questo è importante per me. Mi permette di focalizzazione sul core molto importante del programma, di solito la ragione per cui ho usato c, in primo luogo.

In linguaggi di alto livello, è meglio avere una buona ragione. :)

Invece di fare uno, mi piacerebbe Unix in su e costruire un quadro scritto intorno al vostro app, utilizzando gli argomenti della riga di comando e stdin.

Altri sono menzionati buoni punti (affidabilità, la sicurezza, la sicurezza, portabilità, ecc) - ma mi butto fuori un altro. Prestazione. Generalmente è molte volte più veloce di chiamare una funzione di libreria o anche generare un nuovo thread, allora è di iniziare un intero nuovo processo (e poi si deve ancora verificare correttamente / verificare è l'esecuzione e analizzare il suo output!)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top