Unix-Linux編程實踐教程——utmplib.c

//
// 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];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章