6. ENTRADA/SORTIDA SOBRE TERMINALS

Un terminal és un dispositiu especial de tipus caràcter, és a dir, vist com un fitxer no és ordinari sinó de tipus "c". Els fitxers que el sistema obre per a cada procés (0, 1, i 2 o entrada estàndard, sortida estàndard i error estàndard) són terminals.

Per a poder accedir a informació al voltant de terminals i usuaris connectats, ens cal prèviament conéixer l'struct utmp que podrà recollir informació al voltant del terminal associat a un procés. En les distribucions Linkat el podem trobar definit a /usr/include/bits/utmp.h on podeu veure com alguns dels camps d'aquest struct són els següents:

short int ut_type Tipus de procés. Tot seguit en comentem quins possibles valors té aquest camp
pid_t ut_pid pid del procés.
char ut_line[UT_LINESIZE] Terminal associat (ttyXX o així). UT_LINESIZE al Linkat 1.0 val 32
char ut_user[UT_NAMESIZE] Usuari associat al procés. UT_NAMESIZE al Linkat 1.0 val 32
char ut_host[UT_HOSTSIZE] Nom del host. UT_HOSTSIZE al Linkat 1.0 val 256

Els possibles valors del membre ut_type són (això ho deixem tal com és al fitxer bits/utmp.h):

#define EMPTY           0       /* No valid user accounting information.  */

#define RUN_LVL         1       /* The system's runlevel.  */
#define BOOT_TIME       2       /* Time of system boot.  */
#define NEW_TIME        3       /* Time after system clock changed.  */
#define OLD_TIME        4       /* Time when system clock changed.  */

#define INIT_PROCESS    5       /* Process spawned by the init process.  */
#define LOGIN_PROCESS   6       /* Session leader of a logged in user.  */
#define USER_PROCESS    7       /* Normal process.  */
#define DEAD_PROCESS    8       /* Terminated process.  */

#define ACCOUNTING      9

 La funció per tal d'obtenir la informació que podem bolcar en un struct utmp és la següent:

#include <utmp.h>

struct utmp *getutent(void);

Com que retorna un apuntador, no cal que reservem espai per a l'struct que contindrà el resultat. D'aquest fet, també podem deduir que si no funciona correctament retornarà un apuntador NULL.

Amb cada crida a aquesta funció es llegeix una entrada del fitxer /var/run/utmp amb informació dels usuaris connectats al sistema.

El següent programa ens mostra com podem utilitzar aquesta funció:

Un exercici interessant podria ser fer un programa que miri si un cert usuari està connectat, mirar a quin terminal i enviar-li un missatge escrivint directament sobre el terminal obert amb open.