//
// Created by Eddie on 2020/3/14.
//
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <utmp.h>
#include <zconf.h>
#define NRECS 16
#define NULLUT ((struct utmp *) NULL)
#define UTSIZE (sizeof(struct utmp))
static char utmpbuf[NRECS * UTSIZE];
static int num_recs;
static int cur_rec;
static int fd_utmp;
int utmp_open(char * filename){
fd_utmp = open(filename, O_RDONLY);
cur_rec = num_recs = 0;
return fd_utmp;
}
int utmp_reload(){
int amt_read;
amt_read = read(fd_utmp, utmpbuf, NRECS * UTSIZE);
num_recs = amt_read/UTSIZE;
cur_rec = 0;
return num_recs;
}
utmp * utmp_next(){
struct utmp * recp;
if(fd_utmp == -1){
return NULLUT;
}
if(cur_rec == num_recs && utmp_reload() == 0)
return NULLUT;
recp = (utmp * )&utmpbuf[cur_rec * UTSIZE];//逐個返回utmp地址(cur_rec * UTSIZE)
cur_rec++;
return recp;
}
void utmp_close(){
if(fd_utmp != -1)
close(fd_utmp);
}
其中的這行代碼看了很久,逐個返回utmp地址(cur_rec * UTSIZE)
recp = (utmp * )&utmpbuf[cur_rec * UTSIZE];