最近使用go获取Linux所有登录用户,运行额外进程(
w
|top
)解析字符串方式不够方便,
因此找到原生调用方式,测试验证后记录下来
原理
Linux下登录的用户信息包含在/var/run/utmp
文件下,每个用户为一个utmp
结构体,读取并解析出所有用户.
参考 https://man7.org/linux/man-pages/man5/utmp.5.html
#define UT_LINESIZE 32
#define UT_NAMESIZE 32
#define UT_HOSTSIZE 256
struct exit_status {
/* Type for ut_exit, below */
short e_termination; /* Process termination status */
short 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