您的位置:首页 > 其它

自己编写who命令

2012-08-21 20:21 381 查看
系统: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 not

void 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     */
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: