05. Chiamate di sistema - unistd.h

Le funzioni di interfaccia con il sistema operativo non fanno parte dello standard ANSI del C, ma sono implementate in quasi tutte le versioni dei compilatori.

Le chiamate di sistema (system call) possono essere classificate in 5 differenti categorie:

  • Controllo del processo: includono primitive che controllano l’avvio o l’esecuzione oppure lo stop o l’interruzione dei processi.

  • Gestione dei file: includono primitive per la gestione dei file, tra cui “create” (creare), “delete” (eliminare), “open” (aprire), “close” (chiudere), “write” (scrivere) und “read” (leggere).

  • Gestione dei dispositivi: queste primitive consentono di gestire le risorse hardware.

  • Gestione delle informazioni: i processi sono collegati a molte informazioni, in cui la tempestività e l’integrità svolgono un ruolo importante. Per scambiarle o richiederle, i programmi applicativi utilizzano le System Calls di gestione e conservazione delle informazioni.

  • Comunicazione tra processi: queste primitive consentono l'interazione tra processi diversi.

L'implementazione delle system call dipende sia dall'architettura hardware che dal sistema operativo e pertanto assumono forme differenti in Windows e Linux.

Alcuni esempi di System Call sono riportati di seguito:

    • Creare un processo (categoria Controllo del processo):

      • Linux: fork()

      • Windows: CreateProcess()

    • Terminare un processo (categoria Controllo del processo):

      • Linux: exit()

      • Windows: ExitProcess()

    • Creare/aprire un file (categoria Gestione dei file)

      • Linux: open()

      • Windows: CreateFile()

    • Leggere un file (categoria Gestione dei file)

      • Linux: read()

      • Windows: ReadFile()

    • Scrivere un file (categoria Gestione dei file)

      • Linux: write()

      • Windows: WriteFile()

    • Chiudere un file (categoria Gestione dei file)

      • Linux: close()

      • Windows: CloseHandle()

    • Aprire un dispositivo (categoria Gestione dei dispositivi)

      • Linux: read()

      • Windows: ReadConsole()

    • Chiudere un dispositivo (categoria Gestione dei dispositivi)

      • Linux: close()

      • Windows: CloseConsole()

    • Definizione di un intervallo di tempo specifico (categoria Gestione delle informazioni)

      • Linux: alarm()

      • Windows: SetTimer()

    • Sospensione di un processo (categoria Gestione delle informazioni)

      • Linux: sleep()

      • Windows: Sleep()

    • Creare pipe (buffer per il flusso di dati tra due processi) (categoria Comunicazione tra processi)

      • Linux: pipe()

      • Windows: CreatePipe()

    • Creazione di una memoria condivisa (Shared Memory) (categoria Comunicazione tra processi)

      • Linux: shmget()

      • Windows: CreateFileMapping()


Per i sistemi Linux le principali libreria per l'accesso alle system call sono unistd.h, stat.h, fcntl.h, ipc.h, shm.h. Per accedere a queste primitive occorre includere


#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <sys/ipc.h>

#include <sys/shm.h>


Per i sistemi Windows la principale libreria per l'accesso alle system call è windows.h. Per accedere a queste primitive occorre includere

#include <windows.h>

In ambiente Windows le implementazioni Cygwin e MinGW del compilatore C supportano la libreria unistd.h in modo da rendere compatibili molte system call Linux in ambiente Windows.