[C++] 纯文本查看 复制代码
/* Values for ut_type field, below */
#define EMPTY 0 /* Record does not contain valid info
(formerly known as UT_UNKNOWN on Linux) */
#define RUN_LVL 1 /* Change in system run-level (see
init(8)) */
#define BOOT_TIME 2 /* Time of system boot (in ut_tv) */
#define NEW_TIME 3 /* Time after system clock change
(in ut_tv) */
#define OLD_TIME 4 /* Time before system clock change
(in ut_tv) */
#define INIT_PROCESS 5 /* Process spawned by init(8) */
#define LOGIN_PROCESS 6 /* Session leader process for user login */
#define USER_PROCESS 7 /* Normal process */
#define DEAD_PROCESS 8 /* Terminated process */
#define ACCOUNTING 9 /* Not implemented */
#define UT_LINESIZE 32
#define UT_NAMESIZE 32
#define UT_HOSTSIZE 256
struct exit_status { /* Type for ut_exit, below */
short int e_termination; /* Process termination status */
short int e_exit; /* Process exit status */
};
struct utmp {
short ut_type; /* Type of record */
pid_t ut_pid; /* PID of login process */
char ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */
char ut_id[4]; /* Terminal name suffix,
or inittab(5) ID */
char ut_user[UT_NAMESIZE]; /* Username */
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
kernel version for run-level
messages */
struct exit_status ut_exit; /* Exit status of a process
marked as DEAD_PROCESS; not
used by Linux init(8) */
/* The ut_session and ut_tv fields must be the same size when
compiled 32- and 64-bit. This allows data files and shared
memory to be shared between 32- and 64-bit applications. */
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
int32_t ut_session; /* Session ID (getsid(2)),
used for windowing */
struct {
int32_t tv_sec; /* Seconds */
int32_t tv_usec; /* Microseconds */
} ut_tv; /* Time entry was made */
#else
long ut_session; /* Session ID */
struct timeval ut_tv; /* Time entry was made */
#endif
int32_t ut_addr_v6[4]; /* Internet address of remote
host; IPv4 address uses
just ut_addr_v6[0] */
char __unused[20]; /* Reserved for future use */
};
[C++] 纯文本查看 复制代码
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <utmpx.h>
#include <paths.h>
int main(int argc, char *argv[])
{
struct utmpx *utp;
setutxent();
printf ("User Type PID Line Id Host Date/time\n");
while ((utp = getutxent()) != NULL) { /*顺序读取*/
printf("%-8s ", utp->ut_user);
printf("%-9.9s ",
(utp->ut_type == EMPTY) ? "EMPTY" :
(utp->ut_type == RUN_LVL) ? "RUN_LVL" :
(utp->ut_type == BOOT_TIME) ? "BOOT_TIME" :
(utp->ut_type == NEW_TIME) ? "NEW_TIME" :
(utp->ut_type == OLD_TIME) ? "OLD_TIME" :
(utp->ut_type == INIT_PROCESS)? "INIT_PR" :
(utp->ut_type == LOGIN_PROCESS)? "LOGIN_PR" :
(utp->ut_type == USER_PROCESS) ? "USER_PR" :
(utp->ut_type == DEAD_PROCESS) ? "DEAD_PR" : "???");
printf ("%-5d %-6.6s %-9.9s %-20.20s ", (long)utp->ut_pid, utp->ut_line, utp->ut_id, utp->ut_host);
printf ("%s", ctime((time_t *) & (utp->ut_tv.tv_sec)));
}
endutxent();
exit (EXIT_SUCCESS);
}