第一个版本:

  1. /* who1.c - a first version of the who program
  2. * open, read UTMP file, and show results.
  3. */
  4. #include <stdio.h>
  5. #include <utmp.h>
  6. #include <fcntl.h>
  7. #include <utmp.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #define SHOWHOST /* include remote machine on output */
  11. void show_info( struct utmp *utbufp );
  12. int main(int argc, char *argv[])
  13. {
  14. struct utmp current_record; /* read info into here */
  15. int utmpfd; /* read from this file descriptor */
  16. int reclen = sizeof(current_record);
  17. if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 )
  18. {
  19. perror( UTMP_FILE ); /* UTMP_FILE is in utmp.h */
  20. exit(1);
  21. }
  22. while( read(utmpfd, ¤t_record, reclen) == reclen)
  23. {
  24. show_info(¤t_record);
  25. }
  26. close(utmpfd);
  27. return 0;
  28. }
  29. /* show_info()
  30. * displays contents of the utmp struct in human readable form.
  31. * *note* these sizes should not be hardwird.
  32. */
  33. void show_info( struct utmp *utbufp )
  34. {
  35. printf("%-8.8s", utbufp->ut_name); /* the logname */
  36. printf("\t");
  37. printf("%-8.8s", utbufp->ut_line); /* the tty */
  38. printf("\t");
  39. printf("%-10ld", utbufp->ut_time); /* login time */
  40. printf("\t");
  41. #ifdef SHOWHOST
  42. printf("(%s)", utbufp->ut_host); /* the host */
  43. #endif
  44. printf("\n");
  45. }
第一个版本的效果如下:


总结:能够分栏按照格式显示4栏用户信息,但是不能区分非实际用户,不能纠正时间显示问题
解决方法:
实际用户------在 "/usr/include /bits/utmp.h"中有相关的宏定义,能够用此来区分实际用户。

在显示信息函数 show_info() 中如此修改:


纠正时间显示问题------转换时间到human readable。
了解到 unix 保存时间为 time_t 类型,是一个type long int time_t。
那么把时间转换为 human readable 的函数式 ctime():
  1. char* ctime(const time_t *timep)
结合我们需要显示的格式,那么正确的使用方法是这样的:
  1. printf("%12.12s",ctime(&t)+4);
最终的源文件如下:
  1. /* who1.c - a first version of the who program
  2. * open, read UTMP file, and show results.
  3. */
  4. #include <stdio.h>
  5. #include <utmp.h>
  6. #include <fcntl.h>
  7. #include <utmp.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #define SHOWHOST /* include remote machine on output */
  11. void show_info( struct utmp *utbufp );
  12. void show_time(const time_t *timep);
  13. int main(int argc, char *argv[])
  14. {
  15. struct utmp current_record; /* read info into here */
  16. int utmpfd; /* read from this file descriptor */
  17. int reclen = sizeof(current_record);
  18. if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 )
  19. {
  20. perror( UTMP_FILE ); /* UTMP_FILE is in utmp.h */
  21. exit(1);
  22. }
  23. while( read(utmpfd, ¤t_record, reclen) == reclen)
  24. {
  25. show_info(¤t_record);
  26. }
  27. close(utmpfd);
  28. return 0;
  29. }
  30. /* show_time() - transform long time to human readable.
  31. */
  32. void show_time(const time_t *timep)
  33. {
  34. printf("%14.14s", ctime(timep) + 4);
  35. }
  36. /* show_info()
  37. * displays contents of the utmp struct in human readable form.
  38. * *note* these sizes should not be hardwird.
  39. */
  40. void show_info( struct utmp *utbufp )
  41. {
  42. if (utbufp->ut_type != USER_PROCESS)
  43. return;
  44. printf("%-8.8s", utbufp->ut_name); /* the logname */
  45. printf("\t");
  46. printf("%-8.8s", utbufp->ut_line); /* the tty */
  47. printf("\t");
  48. //printf("%-10ld", utbufp->ut_time); /* login time */
  49. show_time(&(utbufp->ut_time));
  50. printf("\t");
  51. #ifdef SHOWHOST
  52. printf("(%s)", utbufp->ut_host); /* the host */
  53. #endif
  54. printf("\n");
  55. }

最终的效果如下:

编写who命令的更多相关文章

  1. 编写linux 命令行实用工具 shell命令

    今天我想以带着问题的方法学习新的技术. 问题1: 编写一个命令 语法: command  options  path  expressions

  2. Linux系统编程【3.1】——编写ls命令

    ls命令简介 老规矩,直接在终端输入:man ls (有关于man命令的简介可以参考笔者前期博客:Linux系统编程[1]--编写more命令) 可以看到,ls命令的作用是显示目录中的文件名,它带有可 ...

  3. Linux系统编程【2】——编写who命令

    学到的知识点 通过实现who命令,学到了: 1.使用man命令寻找相关信息 2.基于文件编程 3.体会到c库函数与系统调用的不同 4.加深对缓冲技术的理解 who命令的作用 who命令的使用 在控制终 ...

  4. 编写who命令:文件操作,缓冲区与联机帮助

    最近阅读UULP(Understanding Unix/Linux Programming),按照书中介绍对Unix/Linux系统编程进行学习梳理,总结如下. 1. who命令能做什么 who命令用 ...

  5. 编写批处理命令来执行JAVA文件

    http://baobeituping.iteye.com/blog/802543 1. JAVA工程路径结构 Project    ------lib    ------src    ------W ...

  6. 让你如绅士般基于描述编写 Python 命令行工具的开源项目:docopt

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  7. CMakeLists.txt编写常用命令

    目录 1. 设置cmake最小版本 2. 设置项目名称 3. 设置编译目标类型 4. 指定编译包含的源文件 1. 明确指明包含的源文件 2. 搜索指定目录的所有的cpp文件 3. 自定义搜索规则 4. ...

  8. docker Dockerfile文件的编写部分命令

    镜像的构建过程:编写dockerfile文件,执行docker build 进行构建镜像,最后docker run 运行容器镜像实例. docker build -t mycentos:1.01 . ...

  9. Linux系统编程【1】——编写more命令

    背景介绍 笔者知识背景 笔者接触Linux快一年了.理论知识方面:学习了操作系统基础知识,了解进程调度.内存分配.文件管理.磁盘I/O这些基本的概念. 实操方面:会使用Linux简单命令,在嵌入式系统 ...

  10. django “如何”系列2:如何编写django-admin 命令

    应用可以使用manage.py注册自己的动作,例如,你可能想要为你即将发布的应用添加一个manage.py 操作.这节我们将为polls应用添加一个closepoll的命令 添加一个managemen ...

随机推荐

  1. (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

    上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点.这 ...

  2. android kl 文件的作用【转】

    本文转载自:http://blog.csdn.net/u013308744/article/details/49274069 首先看touchscreen的kl文件 # Copyright (c) 2 ...

  3. JavaScript Patterns 2.1 Writing Maintainable Code

    Revisiting the code after some time has passed requires: • Time to relearn and understand the proble ...

  4. go语言笔记——map map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序

    示例 8.1 make_maps.go package main import "fmt" func main() { var mapLit map[string]int //va ...

  5. MSP430:中断简介

    (5).中断应用程序举例(外部中断): void interrupt_initial() { P1DIR&=~BIT7;      //P1.7为输入 P1IE|=0x80;      //P ...

  6. 通过usb连接adb

    手机不同进入的方式可能不一样,我使用的是努比亚手机. 借鉴这里的:http://adbshell.com/commands/adb-connect 在Wi-Fi上使用ADB:adb connect & ...

  7. 【转】深入理解Java多态原理

    之前一直知道多态是什么东西,平时敲代码也经常用到多态,但一直没有真正了解多态底层的运行机制到底是怎么样的,这两天才研究明白点,特地写下来,跟各位同学一起进步,同时也希望各位大神指导和指正. 多态的概念 ...

  8. 题解报告:hdu 1527 取石子游戏(威佐夫博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...

  9. HDFS你一定要知道,要考的

    你肯定听过Hadoop,对就是那头奔跑的小象. Hadoop作为大数据时代代表性的解决方案被大家所熟知,它主要包含两部分内容: HDFS分布式文件存储 MapReduce分布式计算框架 前面我们分析存 ...

  10. asp.net——登录界面

    题目: 在页面中放入两个TextBox分别用于输入用户名和密码,一个显示文字用的Label,一个提交按钮Button.点击按钮提交用户名和密码,如果用户名都密码正确(比如用户名admin 密码abc1 ...