自己编写who命令

来源:互联网 发布:中国网络诗歌网站 编辑:程序博客网 时间:2024/05/15 11:15

系统:ubuntu 12.04


1.man who

有这么几句话:

      If FILE is not specified, use /var/run/utmp.  /var/log/wtmp as FILE  is
       common.   If  ARG1  ARG2  given, -m presumed: `am i' or `mom likes' are
       usual.


who命令索取信息存在这个文档中

2.看到关键词utmp wtmp

  man -k utmp

 挑选后的结果

utmp (5)             - login records

3.察看utmp的帮助文档

   man 5 utmp


里面有utmp数据结构的详细说明


4.将文件中utmp中的信息读取出来


用 open read close 函数


5.在我的struct utmp 中没有ut_time 的直接定义

# define ut_time        ut_tv.tv_sec 

 struct
   {
     int32_t tv_sec;             /* Seconds.  */   //时间的秒数
     int32_t tv_usec;            /* Microseconds.  */
   } ut_tv;

#include        <stdio.h>#include<stdlib.h>#include        <unistd.h>#include        <utmp.h>#include        <fcntl.h>#include        <time.h> #define      SHOWHOST   //decide to show host or notvoid showtime(long);void show_info(struct utmp *);int main(){        struct utmp     utbuf;          /* read info into here */        int             utmpfd;         /* read from this descriptor */        if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){                perror(UTMP_FILE);          //perror()                exit(1);        }        while( read(utmpfd, &utbuf, sizeof(utbuf)) == sizeof(utbuf) )                show_info( &utbuf );        close(utmpfd);        return 0;}void show_info( struct utmp *utbufp ){        if ( utbufp->ut_type != USER_PROCESS )  //dont show no useful infomation                return;        printf("%-8.8s", utbufp->ut_name);      /* the logname  */        printf(" ");                            /* a space      */        printf("%-8.8s", utbufp->ut_line);      /* the tty      */        printf(" ");                            /* a space      */        showtime( utbufp->ut_time );            /* display time */#ifdef SHOWHOST        if ( utbufp->ut_host[0] != '\0' )                printf(" (%s)", utbufp->ut_host);/* the host    */#endif        printf("\n");                          /* newline      */}void showtime( long timeval )/* *      displays time in a format fit for human consumption *      uses ctime to build a string then picks parts out of it *      Note: %12.12s prints a string 12 chars wide and LIMITS *      it to 12chars. */{        char    *cp;                    /* to hold address of time      */        cp = ctime(&timeval);           /* convert time to string       */                                        /* string looks like            */                                        /* Mon Feb  4 00:46:40 EST 1991 */                                        /* 0123456789012345.            */        printf("%12.12s", cp+4 );       /* pick 12 chars from pos 4     */}





原创粉丝点击