[SO] Differenza fra API e system calls
Buongiorno! Come da titolo, sto cercando di capire la differenza/relazione fra le due. Infatti il libro di testo lo spiega in maniera abbastanza vaga, non capisco di preciso qual'è la relazione fra le due. Il libro cita così:
"API, application programming interface. Essa specifica un insieme di funzioni a disposizione dei programmatori, e dettaglia i parametri necessari all'invocazione di queste funzioni, insieme ai lavori restituiti". Successivamente spiega che ci sono tre diversi tipi di API, ovvero le API Win32, API POSIX, API Java.
Poi ci sono alcuni esempi di system calls:
Windows: CreateProcess(), ExitProcess(), WaitForSingleObject()
UNIX: fork(), exit(), wait()
C'è scritto che conviene usare le API invece che le system calls, per via della loro portabilità. Però sul libro non c'è nessun esempio di API, ma solo di system calls.
Alla fine, da quanto descritto, la differenza sembra che stia nel fatto che le API sono uguali per tutti i sistemi, quindi ad esempio se voglio sdoppiare un processo basta che uso la determinata funzione delle API, e decide lui in base al sistema in cui gira se accedere a CreateProcess() piuttosto che alla fork(). Ho capito bene? O c'è una differenza più sottile?
"API, application programming interface. Essa specifica un insieme di funzioni a disposizione dei programmatori, e dettaglia i parametri necessari all'invocazione di queste funzioni, insieme ai lavori restituiti". Successivamente spiega che ci sono tre diversi tipi di API, ovvero le API Win32, API POSIX, API Java.
Poi ci sono alcuni esempi di system calls:
Windows: CreateProcess(), ExitProcess(), WaitForSingleObject()
UNIX: fork(), exit(), wait()
C'è scritto che conviene usare le API invece che le system calls, per via della loro portabilità. Però sul libro non c'è nessun esempio di API, ma solo di system calls.
Alla fine, da quanto descritto, la differenza sembra che stia nel fatto che le API sono uguali per tutti i sistemi, quindi ad esempio se voglio sdoppiare un processo basta che uso la determinata funzione delle API, e decide lui in base al sistema in cui gira se accedere a CreateProcess() piuttosto che alla fork(). Ho capito bene? O c'è una differenza più sottile?
Risposte
ciao black 
la differanza è che le sys-call sono particolari funzioni di sistema per avere un accesso all'OS da user-layer e richiedere il permesso di far qualcosa.
Le API utilizzano le system-call a loro volta per implementare funzioni delle più disparate, dall grafica ai thread ad alto livello.
PS: le definizioni le hai prese da quel mattone del silberschatz?

la differanza è che le sys-call sono particolari funzioni di sistema per avere un accesso all'OS da user-layer e richiedere il permesso di far qualcosa.
Le API utilizzano le system-call a loro volta per implementare funzioni delle più disparate, dall grafica ai thread ad alto livello.
PS: le definizioni le hai prese da quel mattone del silberschatz?
Ciao hamming_burst 
Grazie della risposta! Ma quindi vengono dette portabili per il motivo che ho detto? Cioè se uso la stessa API su diversi sistemi, il risultato è automaticamente corretto? Mentre invece per ogni sistema bisogna usare la system call appropriata.
Si esatto, le ho prese da quel mattone (scritto anche male XD)

Grazie della risposta! Ma quindi vengono dette portabili per il motivo che ho detto? Cioè se uso la stessa API su diversi sistemi, il risultato è automaticamente corretto? Mentre invece per ogni sistema bisogna usare la system call appropriata.
Si esatto, le ho prese da quel mattone (scritto anche male XD)
"Black27":
Ciao hamming_burst
Grazie della risposta! Ma quindi vengono dette portabili per il motivo che ho detto? Cioè se uso la stessa API su diversi sistemi, il risultato è automaticamente corretto? Mentre invece per ogni sistema bisogna usare la system call appropriata.
Si esatto, le ho prese da quel mattone (scritto anche male XD)
Non vorrei dire cavolate (quindi aspetta anche la risposta di qualcuno più esperto di me...) ma no...se ad esempio usi una API di Windows su Linux te la tiri in fronte (anzi credo che neanche la possa eseguire nel caso da codice sorgente la vai a ricompilare)
Questo perchè le system call di Linux sono per avere accesso a determinate risorse di Linux mentre quelle di Windows servono per avere accesso a determinate risorse di Windows...e le syscall di Windows e di Linux siano diverse
Credo che la differenza tra API e Systemcall sia come ti è stato detto che le system call è come se servissero ad accedere a particolari risorse del sistema operativo in questione...
Non vorrei dire cavolate immani (l'esame di sistemi operativi l'ho fatto tanti anni fà e la sistemistica non è il mio mestiere...) ma per farti un esempio...su UNIX c'è la systemcall shutdown che serve a spegnere il computere, Windows avrà la sua...servono per interfacciare l'utente (ed i programmi) a fare interazioni di base direttamente con il sistema operativo e per accedere a risorse del sistema operativo
Un'API invece non dovrebbe essere altro che una libreria che magari usa le systemcall (ma non è detto, credo potrebbero anche non usarle se non serve per lo scopo...) ed implementa funzioni complesse...tipo magari gestire la grafica...interfacciarsi con un'API che ti dà a disposizione cose già fatte è meglio che riscriversi tonnellate di codice a manella...
Ripeto...tutto ciò che ho detto prendilo con le pinze...
Infatti avevo pensato anch'io così come tu mi hai detto, la cosa che mi lascia perplesso è appunto il fatto che un vantaggio delle API sia la portabilità. Non capisco in che senso possano essere portabili! (Grazie della risposta
)

"Black27":
Infatti avevo pensato anch'io così come tu mi hai detto, la cosa che mi lascia perplesso è appunto il fatto che un vantaggio delle API sia la portabilità. Non capisco in che senso possano essere portabili! (Grazie della risposta)
es. flash:
API POSIX sono uno standard della POSIX. Sono accettabili sia su OS famiglia *nix che su OS alternativi come Syllable. perciò in questo senso penso sia da intende come portabili. oppure portabili per versioni, cioè tu programmatore basta che conosci l'header punto (es. API Java).
"hamming_burst":
[quote="Black27"]Infatti avevo pensato anch'io così come tu mi hai detto, la cosa che mi lascia perplesso è appunto il fatto che un vantaggio delle API sia la portabilità. Non capisco in che senso possano essere portabili! (Grazie della risposta)
es. flash:
API POSIX sono uno standard della POSIX. Sono accettabili sia su OS famiglia *nix che su OS alternativi come Syllable. perciò in questo senso penso sia da intende come portabili. oppure portabili per versioni, cioè tu programmatore basta che conosci l'header punto (es. API Java).[/quote]
eh si...da programmatore anche io pensavo a Java...da programmatore dico: è ovvio che le API di Java sono diverse su *nix da Windows...ma che me ne frega a me sapere come sono implementate? Installo la macchina virtuale JVM\JDK, ed uso le API che mi mette a disposizione il linguaggio...per poterle usare mi basta conoscere l'interfaccia delle varie classi (la lista dei metodi pubblici astratti e non e delle interface...), fine dei giochi...portabile in quel senso...che al programmatore non gliene frega niente di sapere poi le cose siano implementate a basso livello...
Credo che la cosa valga pure per API grafiche tipo OpenGlide o quel che sia...
Ah ok mi è chiaro, quindi la portabilità è vista in senso più "stretto" rispetto a quello che pensavo...Benissimo, ora mi è chiaro! Grazie a tutti
