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:
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:
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. |