access()
70.5.3 70.5.4.1
alarm()
70.5.3
blkcnt_t
70.1
blksize_t
70.1
BRKINT
70.7.4
cc_t
70.7.1
chdir()
70.5.3 70.5.4.3
chmod()
70.2.3
chown()
70.5.3
clock_t
70.1
close()
70.5.3
closedir()
70.6.3
confstr()
70.5.3
creat()
70.4.4
dev_t
70.1
DIR
70.6.2
dirent.h
70.6
dup()
70.5.3
dup2()
70.5.3
ECHO
70.7.7
ECHOE
70.7.7
ECHOK
70.7.7
ECHONL
70.7.7
execl()
70.5.3
execle()
70.5.3
execlp()
70.5.3
execv()
70.5.3
execve()
70.5.3
execvp()
70.5.3
fchmod()
70.2.3
fchown()
70.5.3
fcntl()
70.4.4
fcntl.h
70.4
FD_CLOEXEC
70.4.2
ffs()
70.3.1
fork()
70.5.3
fpathconf()
70.5.3
fstat()
70.2.3
ftruncate()
70.5.3
F_DUPFD
70.4.2
F_GETFD
70.4.2
F_GETFL
70.4.2
F_GETLK
70.4.2
F_GETOWN
70.4.2
F_OK
70.5.2
F_RDLCK
70.4.3
F_SETFD
70.4.2
F_SETFL
70.4.2
F_SETLK
70.4.2
F_SETLKW
70.4.2
F_SETOWN
70.4.2
F_UNLCK
70.4.3
F_WRLCK
70.4.3
getcwd()
70.5.3 70.5.4.2
getegid()
70.5.3
geteuid()
70.5.3
getgid()
70.5.3
getgroups()
70.5.3
gethostname()
70.5.3
getlogin()
70.5.3
getlogin_r()
70.5.3
getopt()
70.5.3
getpgrp()
70.5.3
getpid()
70.5.3
getppid()
70.5.3
getuid()
70.5.3
gid_t
70.1
ICANON
70.7.7
ICRNL
70.7.4
id_t
70.1
IEXTEN
70.7.7
IGNBRK
70.7.4
IGNCR
70.7.4
IGNPAR
70.7.4
INLCR
70.7.4
ino_t
70.1
INPCK
70.7.4
isatty()
70.5.3
ISIG
70.7.7
ISTRIP
70.7.4
IXOFF
70.7.4
IXON
70.7.4
link()
70.5.3 70.5.4.4
lseek()
70.5.3
lstat()
70.2.3
mkdir()
70.2.3
mkfifo()
70.2.3
mknod()
70.2.3
mode_t
70.1 70.2.1
NCCS
70.7.2
nlink_t
70.1
NOFLSH
70.7.7
off_t
70.1
open()
70.4.4
opendir()
70.6.3
OPOST
70.7.5
O_ACCMODE
70.4.2
O_APPEND
70.4.2
O_CREAT
70.4.2
O_DSYNC
70.4.2
O_EXCL
70.4.2
O_NOCTTY
70.4.2
O_NONBLOCK
70.4.2
O_RDONLY
70.4.2
O_RDWR
70.4.2
O_RSYNC
70.4.2
O_SYNC
70.4.2
O_TRUNC
70.4.2
O_WRONLY
70.4.2
PARMRK
70.7.4
pathconf()
70.5.3
pause()
70.5.3
pid_t
70.1
pipe()
70.5.3
pthread_t
70.1
read()
70.5.3
readdir()
70.6.3
readlink()
70.5.3
rewinddir()
70.6.3
rmdir()
70.5.3
R_OK
70.5.2
setegid()
70.5.3
seteuid()
70.5.3
setgid()
70.5.3
setpgid()
70.5.3
setsid()
70.5.3
setuid()
70.5.3
size_t
70.1
sleep()
70.5.3
speed_t
70.7.1
ssize_t
70.1
stat()
70.2.3
stat.h
70.2
STDERR_FILENO
70.5.1
STDIN_FILENO
70.5.1
STDOUT_FILENO
70.5.1
strcasecmp()
70.3.2
strings.h
70.3
strncasecmp()
70.3.2
struct dirent
70.6.1
struct termios
70.7.2
structure stat
70.2.2
st_atime
70.2.2
st_blksize
70.2.2
st_blocks
70.2.2
st_ctime
70.2.2
st_dev
70.2.2
st_gid
70.2.2
st_ino
70.2.2
st_mode
70.2.2
st_mtime
70.2.2
st_nlink
70.2.2
st_rdev
70.2.2
st_size
70.2.2
st_uid
70.2.2
symlink()
70.5.3
sys/types.h
70.1
sysconf()
70.5.3
S_IFBLK
70.2.1
S_IFCHR
70.2.1
S_IFDIR
70.2.1
S_IFIFO
70.2.1
S_IFLNK
70.2.1
S_IFMT
70.2.1
S_IFREG
70.2.1
S_IFSOCK
70.2.1
S_IRGRP
70.2.1
S_IROTH
70.2.1
S_IRUSR
70.2.1
S_IRWXG
70.2.1
S_IRWXO
70.2.1
S_IRWXU
70.2.1
S_ISBLK()
70.2.1
S_ISCHR()
70.2.1
S_ISDIR()
70.2.1
S_ISFIFO()
70.2.1
S_ISGID
70.2.1
S_ISLNK()
70.2.1
S_ISREG()
70.2.1
S_ISSOCK()
70.2.1
S_ISUID
70.2.1
S_ISVTX
70.2.1
S_IWGRP
70.2.1
S_IWOTH
70.2.1
S_IWUSR
70.2.1
S_IXGRP
70.2.1
S_IXOTH
70.2.1
S_IXUSR
70.2.1
tcflag_t
70.7.1
tcgetattr()
70.7.8
tcgetpgrp()
70.5.3
TCSADRAIN
70.7.8
TCSAFLUSH
70.7.8
TCSANOW
70.7.8
tcsetattr()
70.7.8
tcsetpgrp()
70.5.3
termios.h
70.7
time_t
70.1
TOSTOP
70.7.7
ttyname()
70.5.3
ttyname_r()
70.5.3
uid_t
70.1
umask()
70.2.3
unistd.h
70.5
unlink()
70.5.3 70.5.4.4
VEOF
70.7.3
VEOL
70.7.3
VERASE
70.7.3
VINTR
70.7.3
VKILL
70.7.3
VMIN
70.7.3
VQUIT
70.7.3
VSTART
70.7.3
VSTOP
70.7.3
VSUSP
70.7.3
VTIME
70.7.3
write()
70.5.3
W_OK
70.5.2
X_OK
70.5.2
_exit()
70.5.3
In generale, la libreria offerta da un compilatore del linguaggio C si può estendere in modo imprecisato verso le definizioni dello standard POSIX. Per esempio, è normale che una libreria C includa le funzionalità relative alla gestione delle espressioni regolari, definite dallo standard POSIX. Pertanto, non esiste propriamente una libreria C e una POSIX, va quindi verificato con il proprio compilatore cosa offrono effettivamente le librerie disponibili, specificando eventualmente, in fase di compilazione, l'inclusione di questa o quella libreria precompilata per la gestione di quella certa funzionalità POSIX.
Nei capitoli successivi vengono descritti alcuni dei file di intestazione previsti dallo standard POSIX, che a loro volta non sono già presi in considerazione dallo standard del linguaggio C. In certi casi viene mostrato come potrebbero essere realizzati questi file (gli esempi dovrebbero essere disponibili a partire da allegati/c/).
|
Il file sys/types.h
viene usato dallo standard POSIX per definire tutti i tipi di dati derivati, inclusi alcuni che già fanno parte dello standard C puro e semplice (si veda eventualmente la realizzazione di questo file nei sorgenti di os32, sezione 95.26). La tabella successiva ne descrive solo una parte.
|
L'esempio successivo mostra come potrebbero essere dichiarati questi tipi derivati, limitatamente ai casi descritti nella tabella:
|
Il file sys/stat.h
viene usato dallo standard POSIX principalmente per definire un insieme di macro-variabili che individuano le caratteristiche fondamentali di un file (tipo di file e permessi), per definire il tipo struct stat che serve a rappresentare lo stato di un file, per dichiarare il prototipo di alcune funzioni che hanno a che fare con queste informazioni (si veda eventualmente la realizzazione del file sys/stat.h
e di alcune delle sue funzioni nei sorgenti di os32, sezione 95.25).
È importante considerare il file sys/stat.h
assieme a fcntl.h
.
Nel file sys/stat.h
si fa riferimento a un insieme di tipi derivati, dichiarati nel file sys/types.h
. Per semplicità, l'esempio propone la sua inclusione iniziale:
|
Il tipo derivato mode_t serve a rappresentare il tipo di un file (o di una directory) e i permessi disponibili. Questo tipo si traduce generalmente in un intero a 16 bit. Trattandosi di un valore numerico, queste informazioni sono distinte a gruppi di bit, selezionabili attraverso una maschera. Pertanto, tra le macro-variabili che distinguono le varie caratteristiche associabili a una variabile di tipo mode_t, alcune vanno usate come maschera, per distinguere un certo insieme di informazioni, dalle altre.
|
Inoltre, vengono definite delle macroistruzioni per distinguere il tipo di file, dalle informazioni contenute in una variabile di tipo mode_t, ammesso che queste informazioni siano incluse effettivamente:
|
Il file sys/stat.h
include la dichiarazione del tipo derivato struct stat, con lo scopo di contenere le informazioni disponibili su di un file. La struttura deve contenere almeno i membri che appaiono nell'esempio successivo:
|
Il file sys/stat.h
include la dichiarazione di alcuni prototipi di funzione, come si vede nell'esempio seguente:
|
Il file di intestazione strings.h
contiene i prototipi di alcune funzioni, legate prevalentemente alla scansione delle stringhe. Dal momento che viene usato il tipo derivato size_t, questo viene definito attraverso l'inclusione del file stddef.h.
|
Lo standard prevede anche altri prototipi di funzioni ormai superate, che rimangono solo per compatibilità con il passato.
La funzione ffs() serve a scandire i bit di un valore numerico intero, alla ricerca del primo bit a uno, partendo dalla posizione meno significativa, restituendo l'indice di tale bit, considerando il bit meno significativo avente indice uno. Pertanto, se il valore da scandito è pari a zero (non ha alcun bit a uno), la funzione restituisce zero.
Al di fuori dello standard, è probabile trovare delle altre funzioni simili a questa, per la scansione degli interi di tipo long int e di tipo long long int. In tal caso, i nomi delle funzioni ulteriori possono essere ffsl() e ffsll().
Le funzioni strcasecmp() e strncasecmp() servono a confrontare due stringhe, ignorando la differenza tra maiuscole e minuscole. Nel caso di strncasecmp() il confronto è limitato a una certa quantità massima di caratteri.
Se la configurazione locale è quella POSIX, il confronto avviene come se le due stringhe venissero convertite preventivamente in caratteri minuscoli; ma nel caso sia attiva una configurazione locale differente, lo standard non specifica in che modo la comparazione abbia luogo.
Il valore restituito dalle due funzioni dipende dal confronto lessicografico delle due stringhe. Se sono uguali (a parte la differenza tra maiuscole e minuscole), il risultato è zero; se la prima stringa è lessicograficamente precedente rispetto alla seconda, il valore restituito è inferiore a zero; se la prima stringa è lessicograficamente successiva alla seconda, il valore ottenuto è superiore a zero.
Il file di intestazione fcntl.h
riguarda la parte fondamentale della gestione dei file, attraverso i descrittori; precisamente si considerano la creazione, l'apertura e l'attribuzione di opzioni di funzionamento, mentre altre questioni sono gestite attraverso le definizioni contenute nel file unistd.h
(si veda eventualmente la realizzazione del file fcntl.h
e di alcune delle sue funzioni nei sorgenti di os32, sezione 95.6).
Il file di intestazione fcntl.h
utilizza alcuni tipi di dati derivati, già definiti nel file sys/types.h
:
|
Nel file di intestazione fcntl.h
si definiscono varie macro-variabili, di cui un primo insieme riguarda, quasi in modo esclusivo, l'uso della funzione fcntl().
|
Le macro-variabili F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK, F_SETLKW, F_GETOWN e F_SETOWN, servono per dichiarare il tipo di comando da dare alla funzione fcntl(), attraverso il suo secondo parametro:
int fcntl (int fdn, int cmd, ...); |
La macro-variabile FD_CLOEXEC riguarderebbe un insieme di indicatori associati a un descrittore di file (fd_flags), di cui però ne esiste uno solo, rappresentato dalla macro-variabile stessa. Utilizzando la funzione fcntl() e specificando il comando F_GETFD è possibile ottenere lo stato di questi indicatori (ovvero solo FD_CLOEXEC), mentre con il comando F_SETFD è possibile modificare questo stato. Quando l'indicatore FD_CLOEXEC risulta attivo per un certo descrittore di file, se viene eseguita la sostituzione del processo con l'ausilio di una funzione del gruppo exec...(), il descrittore in questione viene chiuso, mentre diversamente rimarrebbe aperto.
Nel file di intestazione fcntl.h
vengono dichiarate anche delle macro-variabili per definire la modalità di accesso a un file, da usare prevalentemente con la funzione open():
|
Alcune macro-variabili e il tipo derivato struct flock servono per la gestione del blocco dei file.(1) L'esempio seguente si limita ai soli membri indispensabili:
|
Sono presenti anche i prototipi delle funzioni creat(), fcntl() e open():
|
Per l'uso delle funzioni open() e creat() si veda la sezione 68.5.
La funzione fcntl() esegue un'operazione, definita dal parametro cmd, sul descrittore richiesto come primo parametro (fdn). A seconda del tipo di operazione richiesta, potrebbero essere necessari degli argomenti ulteriori, i quali però non possono essere formalizzati in modo esatto nel prototipo della funzione. Il valore del secondo parametro che rappresenta l'operazione richiesta, va fornito in forma di costante simbolica, come descritto nell'elenco seguente, nel quale però sono descritti solo alcuni dei comandi possibili.
|
Il significato del valore restituito dalla funzione dipende dal tipo di operazione richiesta, come sintetizzato dalla tabella successiva, relativa ai soli comandi già apparsi. In generale, anche per gli altri comandi, un risultato erroneo viene comunque evidenziato dalla restituzione di un valore negativo.
|
Il file di intestazione unistd.h
raccoglie un po' di tutto ciò che riguarda le estensioni POSIX, pertanto è frequente il suo utilizzo (si veda eventualmente la realizzazione del file unistd.h
e di alcune delle sue funzioni nei sorgenti di os32, sezione 95.30).
Nel file unistd.h
si distingue la presenza di un elenco numeroso di macro-variabili con prefissi _POSIX_..., _POSIX2_... e _XOPEN_..., con lo scopo di dichiarare le caratteristiche del sistema e della libreria. Per l'interrogazione delle caratteristiche o delle limitazioni del sistema, si utilizzano però delle funzioni apposite, costituite precisamente da pathconf() e sysconf(), le quali utilizzano un proprio insieme di macro-variabili per individuare le caratteristiche da interrogare. Nel caso di pathconf() si aggiungono macro-variabili con prefisso _PC_...; per sysconf() le macro-variabili hanno il prefisso _SC_....
Nei prototipi di funzione si utilizzano diversi tipi derivati, già dichiarati nei file sys/types.h
e inttypes.h
:
|
Nel file deve anche essere dichiarato il valore per la macro-variabile NULL; in questo caso viene incorporato il file stddef.h
:
|
Per dare un nome ai descrittori dei flussi standard, nel file unistd.h
si dichiarano tre macro-variabili, il cui valore è stabilito necessariamente:
|
La funzione access() consente di verificare l'accessibilità di un file. Per questo richiede l'indicazione del percorso e di un valore che rappresenta i tipi di accesso che si vogliono considerare. Questi sono rappresentati dall'unione di quattro possibili macro-variabili:
|
I valori che questa macro-variabili possono avere devono essere tali da consentire la combinazione con l'operatore | (OR, bit per bit), così da poter verificare simultaneamente tutti gli aspetti dell'accesso al file.
Segue l'elenco dei prototipi delle funzioni principali del file unistd.h
:
|
Nelle sezioni seguenti si descrivono solo alcune delle funzioni destinate alla gestione di file e directory, il cui prototipo appare nel file unistd.h
.
La funzione access() consente di verificare l'accessibilità di un file, il cui percorso viene fornito tramite una stringa. L'accessibilità viene valutata in base a delle opzioni, con cui è possibile specificare a cosa si è interessati in modo preciso.
int access (const char *percorso, int modalità); |
Il secondo parametro della funzione è un numero intero fornito normalmente attraverso l'indicazione di una macro-variabile che rappresenta simbolicamente il tipo di accesso che si intende verificare. Si può utilizzare F_OK per verificare l'esistenza del file o della directory; in alternativa, si possono usare le macro-variabili R_OK, W_OK e X_OK, sommabili assieme attraverso l'operatore OR binario, per la verifica dell'accessibilità in lettura, in scrittura e in esecuzione o attraversamento. Per esempio, scrivendo R_OK|W_OK|X_OK si vuole verificare che il file o la directory sia accessibile con tutti i tre permessi attivi.
|
La funzione restituisce il valore zero se il file o la directory risultano accessibili nel modo richiesto, altrimenti restituisce il valore -1 e si può verificare il tipo di errore valutando il contenuto della variabile errno.
L'esempio seguente descrive completamente l'uso della funzione. Si può osservare che per valutare il successo dell'operazione, l'esito restituito dalla funzione viene invertito; inoltre, il contenuto della variabile errno viene considerato con l'aiuto della funzione perror(). Il file dell'esempio dovrebbe essere disponibile presso allegati/c/esempio-posix-unistd-access.c.
|
La funzione getcwd() (get current working directory) consente di annotare in una stringa il percorso della directory corrente.
char *getcwd (char *buffer, size_t max); |
Come si può vedere dal prototipo della funzione, occorre predisporre prima un array di caratteri, da usare come stringa, in cui la funzione va a scrivere il percorso trovato (con tanto di carattere nullo di terminazione). Come secondo parametro della funzione va indicata la dimensione massima dell'array, oltre la quale la scrittura non può andare.
La funzione restituisce il puntatore alla stringa contenente il percorso, ma se si verifica un errore restituisce il puntatore nullo e aggiorna la variabile errno con la specificazione della causa di tale errore.
L'esempio seguente descrive l'uso della funzione in modo molto semplice; in particolare, in caso di errore si usa la funzione perror() per visualizzarne una descrizione. Il file dell'esempio dovrebbe essere disponibile presso allegati/c/esempio-posix-unistd-getcwd.c.
|
La funzione chdir() (change directory) consente di cambiare la directory corrente del processo elaborativo.
int chdir (const char *path); |
La funzione richiede come unico parametro la stringa che descrive il percorso da raggiungere. La funzione restituisce zero se l'operazione si conclude con successo, oppure il valore -1 in caso di errore, ma in tal caso viene modificata anche la variabile errno con l'indicazione più precisa dell'errore verificatosi.
L'esempio seguente mostra il comportamento della funzione, ma va osservato che l'effetto riguarda esclusivamente il processo in funzione e non si riflette al processo che lo genera a sua volta. Per questa ragione il programma di esempio visualizza la posizione corrente raggiunta. Il file dell'esempio dovrebbe essere disponibile presso allegati/c/esempio-posix-unistd-chdir.c.
|
La funzione link() consente la creazione di un nuovo collegamento fisico a partire da un file o da una directory già esistente, tenendo conto che la facoltà di creare un collegamento fisico a partire da una directory è una funzione privilegiata e il sistema operativo potrebbe non ammetterla in ogni caso. Per collegamento fisico si intende il riferimento contenuto in una directory, verso un certo file o una certa sottodirectory individuati numericamente da un numero inode. La funzione link() produce una sorta di copia del file, nel senso che si predispone un riferimento aggiuntivo alla stessa cosa, senza la duplicazione dei dati relativi. Per converso, la funzione unlink() elimina il riferimento a un file o a una directory, cosa che coincide con la cancellazione del file o della directory, se si tratta dell'ultimo riferimento esistente a tale oggetto nel file system. Anche in questo caso, va considerato in modo particolare l'eliminazione del riferimento a una directory: il sistema operativo può impedirlo se si tratta di una directory non vuota.
int link (const char *p1, const char *p2); |
int unlink (const char *p); |
I parametri delle due funzioni sono stringhe che descrivono il percorso di un file o di una directory. Nel caso di unlink() si indica solo il percorso da rimuovere, mentre con link() se ne indicano due: l'origine e la destinazione che si vuole creare.
Le due funzioni restituiscono un valore intero pari a zero se tutto va bene, altrimenti restituiscono il valore -1, modificando anche il contenuto della variabile errno con un'informazione più precisa sull'accaduto.
Gli esempi seguenti mostrano il comportamento delle due funzioni. I file degli esempi dovrebbero essere disponibili presso allegati/c/esempio-posix-unistd-link.c e allegati/c/esempio-posix-unistd-unlink.c.
|
|
Il file di intestazione dirent.h
raccoglie ciò che serve per la gestione delle directory, attraverso flussi individuati da puntatori di tipo DIR * (si veda eventualmente la realizzazione del file dirent.h
e di alcune delle sue funzioni nei sorgenti di os32, sezione 95.4). La gestione di tali flussi può avvenire attraverso i descrittori di file, così come già avviene per i flussi individuati da puntatori di tipo FILE *, ma ciò è una facoltà, non una necessità realizzativa.
Il file dirent.h
prevede la dichiarazione di un tipo derivato, denominato struct dirent, da usare per rappresentare una voce singola di una directory. I membri necessari di questa struttura sono d_ino, per rappresentare il numero di inode della voce, e d_name[] per contenere il nome del file relativo, completo di carattere nullo di terminazione delle stringhe. La definizione del tipo struct dirent potrebbe essere realizzata nel modo seguente:
|
Nel file dirent.h
è definito il tipo derivato DIR, con il quale si intende fare riferimento a un flusso che individua una directory aperta. Se la gestione di tali flussi avviene attraverso i descrittori di file, ci deve poter essere il riferimento al numero del descrittore relativo. Quello che segue è un esempio di una tale struttura, seguita dalla dichiarazione di un array per il contenimento delle informazioni su tutte le directory aperte del processo:
|
Nella struttura di tipo DIR di questo esempio, viene inclusa una struttura di tipo struct dirent, per permettere alla funzione readdir() di annotare l'ultima voce letta da una certa directory.
La gestione delle directory in forma di flussi di tipo DIR * richiede alcune funzioni specifiche, di cui si trovano i prototipi nel file dirent.h
:
|
La funzione opendir() apre un flusso corrispondente a una directory indicata tramite il suo percorso, restituendo il puntatore relativo. Una volta aperta una directory, si possono leggere le sue voci con la funzione readdir(), la quale restituisce il puntatore di una variabile strutturata di tipo struct dirent, all'interno della quale è possibile trarre i dati della voce letta: negli esempi di questo capitolo, tali informazioni sono incorporate nella struttura DIR che rappresenta la directory aperta. Ogni lettura fa avanzare alla voce successiva della directory e, se necessario, si può riposizionare l'indice di lettura alla prima voce, con la funzione rewinddir(). Per chiudere un flusso aperto, si usa la funzione closedir().
La gestione essenziale del terminale a caratteri è abbastanza complessa e si sintetizza con le definizioni del file termios.h
(si veda eventualmente la realizzazione del file termios.h
e di alcune delle sue funzioni nei sorgenti di os32, sezione 95.28). Lo standard prevede due modalità di inserimento: canonica e non canonica. Negli esempi di questo capitolo ci si sofferma su ciò che serve nel file termios.h
per gestire la modalità canonica, ovvero quella tradizionale per cui il dispositivo del terminale fornisce dati, solo dopo l'inserimento completo di una riga, confermato con un codice di interruzione di riga o con un altro codice che concluda comunque l'inserimento.
Nel file termios.h
vengono definiti alcuni tipi speciali per variabili scalari, che potrebbero essere descritti nel modo seguente:
|
Il tipo tcflag_t viene usato nelle strutture di tipo struct termios, la cui definizione viene fatta nello stesso file termios.h
; il tipo speed_t serve per contenere il valore di una velocità di comunicazione del terminale; il tipo cc_t serve per rappresentare un carattere di controllo, per la gestione del terminale.
Nel file termios.h
viene definita la struttura struct termios, allo scopo di annotare tutte le informazioni sulla modalità di funzionamento di un certo dispositivo di terminale. Nell'esempio seguente si vedono solo i membri obbligatori, ma va considerata l'aggiunta di informazioni legate alla velocità di comunicazione, se il terminale ne deve fare uso. La definizione della struttura struct termios richiede anche la dichiarazione della macro-variabile NCCS, come si vede nell'esempio.
|
Il membro c_iflag contiene gli indicatori che descrivono la modalità di inserimento di dati attraverso il terminale; il membro c_oflag contiene indicatori per la modalità di elaborazione dei dati in uscita, prima della loro lettura; il membro c_cflag contiene opzioni di controllo; il membro lflag contiene opzioni «locali» (qui, in particolare, si definisce se il terminale debba funzionare in modalità canonica o meno); l'array c_cc[] contiene i codici di caratteri da interpretare in modo speciale, per il controllo del funzionamento del terminale.
Durante l'inserimento di dati attraverso il terminale, alcuni codici possono assumere un significato particolare. Il valore numerico di questi codici è annotato nell'array c_cc[] che è membro della struttura di tipo struct termios; per farvi riferimento, l'indice da usare nell'array c_cc[] deve essere indicato attraverso una meta-variabile:
|
Due valori di questo elenco fanno eccezione: VMIN e VTIME, in quanto rappresentano invece un'informazione di tipo differente, necessaria per la gestione non canonica del terminale.
Il membro c_iflag di una struttura di tipo struct termios può contenere degli indicatori indipendenti sulla configurazione per l'inserimento. Tali indicatori vanno forniti attraverso macro-variabili definite nel file termios.h
, di cui segue un esempio:
|
Il membro c_oflag di una struttura di tipo struct termios può contenere degli indicatori indipendenti sulla configurazione per l'output. Tali indicatori vanno forniti attraverso macro-variabili definite nel file termios.h
. Di questi indicatori ne è obbligatorio solo uno: OPOST, che ha lo scopo di abilitare una forma imprecisata di elaborazione dell'output.
|
Il membro c_cflag di una struttura di tipo struct termios può contenere degli indicatori indipendenti sulla configurazione per il controllo del terminale. Tale configurazione qui viene omessa.
Il membro c_lflag di una struttura di tipo struct termios può contenere degli indicatori indipendenti sulla configurazione «locale» del terminale. Tali indicatori vanno forniti attraverso macro-variabili definite nel file termios.h
, di cui segue un esempio:
|
L'indicatore ICANON consente di ottenere un funzionamento del terminale in modalità canonica.
Quanto descritto fino a questo punto sul file termios.h
è ciò che poi serve per l'uso di alcune funzioni, il cui scopo è quello di configurare o interrogare la configurazione di un terminale. Nell'esempio seguente appaiono solo alcuni prototipi, assieme alla dichiarazione di alcune macro-variabili necessarie per la funzione tcsetattr().
|
Le due funzioni mostrate nell'esempio richiedono l'indicazione del numero di descrittore associato a un terminale aperto. Il parametro termios_p è un puntatore a una struttura con le informazioni sulla configurazione del terminale: la funzione tcgetattr() serve a ottenere la configurazione attuale, mentre la funzione tcsetattr() serve a modificarla. Il parametro action di tcsetattr() richiede di precisare la tempestività di tale modifica attraverso una delle macro-variabili elencate poco sopra.
Wikipedia, C POSIX library, http://en.wikipedia.org/wiki/C_POSIX_library
The Open Group, The Single UNIX® Specification, Version 2, System Interface & Headers Issue 5, http://pubs.opengroup.org/onlinepubs/007908799/xshix.html
Free Software Foundation, The GNU C Library, http://www.gnu.org/software/libc/manual/
The Open Group, The Single UNIX® Specification, Version 2, sys/types.h, sys/stat.h strings.h fcntl.h unistd.h dirent.h termios.h
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/sys/types.h.html,
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/sys/stat.h.html,
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/strings.h.html,
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/fcntl.h.html,
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/unistd.h.html,
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/dirent.h.html,
http://pubs.opengroup.org/onlinepubs/000095399/basedefs/termios.h.html
Pagina di manuale fcntl(2)
The Open Group, The Single UNIX® Specification, Version 2, fcntl, http://pubs.opengroup.org/onlinepubs/000095399/functions/fcntl.html
The Open Group, The Single UNIX® Specification, Version 2, General Terminal Interface, http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap11.html
1) Di norma, il programmatore non accede direttamente a variabili di tipo struct flock, perché per la gestione dei blocchi si usano semplicemente le funzioni appropriate.
«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net