Il process control block nel kernel dei sistemi operativi Unix e Unix-like comprende una serie specifica di attributi, gran parte dei quali vengono ereditati dai nuovi processi creati mediante la chiamata di sistema fork() (viene ereditata una copia degli attributi).
Alcuni di essi sono poi automaticamente modificati da una successiva invocazione della chiamata di sistema exec().
Attributi non ereditati
Questi attributi non sono ereditati dai processi figli creati tramite fork():
- PID – Identifica univocamente il processo nel sistema. Non è modificabile e non varia per tutta la durata del processo. L'invocazione di fork() crea un nuovo processo con un nuovo valore per questo attributo.
- parent PID – Identifica il processo padre. Non è modificabile, ma può divenire 1 nel corso della vita del processo se esso rimane orfano. L'invocazione di fork() crea un nuovo processo figlio che ha come valore di questo attributo il PID del processo padre che aveva invocato fork().
Attributi ereditati non modificati da exec()
I processi figli creati tramite fork() ereditano una copia dei seguenti attributi, e successive
invocazioni di exec() non li modificano:
- PGID – Identifica il gruppo di processi di cui questo processo fa parte, ed anche il processo leader del gruppo. Tutti i processi possono modificarselo (con dei limiti) tramite la chiamata di sistema setpgrp().
- SID (Session ID) – Identifica la sessione di cui questo processo fa parte. Tutti i processi possono modificarselo (con dei limiti) tramite le chiamate di sistema setsid() e setpgrp().
- real UID corrente – Identifica l'utente reale proprietario del processo. I processi privilegiati possono modificarselo tramite le chiamate di sistema setuid() e setreuid().
- real GID corrente – Identifica il gruppo principale reale. I processi privilegiati possono modificarselo tramite le chiamate di sistema setgid() e setregid().
- umask corrente – Indica i permessi da negare in fase di creazione di un nuovo File o Directory. Tutti i processi possono modificarsela tramite la chiamata di sistema umask().
- l'elenco dei GID supplementari (in numero massimo dipendente dall'implementazione). I processi privilegiati possono modificarselo tramite la chiamata di sistema setgroups()
- l'elenco dei descrittori dei file correntemente aperti.
- il riferimento all'inode della directory corrente. Tutti i processi possono modificarselo tramite la chiamata di sistema chdir()
- il riferimento all'inode della directory da considerare come radice del file system. I processi privilegiati possono modificarselo tramite la chiamata di sistema chroot().
- il riferimento alla struttura che rappresenta il terminale controllante. Può anche non esservi alcun terminale controllante associato al processo.
Le variabili d'ambiente del processo, pur non facendo parte del process control block, sono ereditate tra processi. I processi possono modificare la propria copia delle variabili mediante le funzioni setenv() o putenv().
Attributi ereditati e modificati da exec()
I processi figli creati tramite fork() ereditano una copia dei seguenti attributi, ma una successiva invocazione di exec() li può modificare:
- effective UID corrente – Identifica l'utente da usare ai fini dei permessi. Normalmente è identico al real UID, ma può essere diverso in caso di programmi set User ID. I processi privilegiati possono modificarselo tramite le chiamate di sistema seteuid(), setuid() e setreuid().
- effective GID corrente – Identifica il gruppo principale da usare ai fini dei permessi. Normalmente è identico al real GID, ma può essere diverso in caso di programmi set User ID. I processi privilegiati possono modificarselo tramite le chiamate di sistema setegid(), setgid() e setregid().
- saved effective UID – Il valore dell'effective UID dopo l'ultimo caricamento di un programma tramite exec(). I processi privilegiati possono modificarselo tramite la chiamata di sistema setuid().
- saved effective GID – Il valore dell'effective GID dopo l'ultimo caricamento di un programma tramite exec(). I processi privilegiati possono modificarselo tramite la chiamata di sistema setgid().
- puntatori ai gestori dei segnali. Ogni processo può modificarseli tramite la chiamata di sistema sigaction().
Bibliografia
- W. Richard Stevens, Advanced Programming in the UNIX Environment, Addison Wesley, 1992, ISBN 0-201-56317-7.
Voci correlate