博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写who命令
阅读量:5718 次
发布时间:2019-06-18

本文共 2977 字,大约阅读时间需要 9 分钟。

第一个版本:
 
  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_infot_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. }
第一个版本的效果如下:
261413056542348.png
总结:能够分栏按照格式显示4栏用户信息,但是
不能区分非实际用户,不能纠正时间显示问题
解决方法:
实际用户------在 "/usr/include /bits/utmp.h"中有相关的宏定义,能够用此来区分实际用户。
261413147644398.png
在显示信息函数 show_info() 中如此修改:
261413190767116.jpg
纠正时间显示问题------转换时间到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_infot_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. }
最终的效果如下:
261413219355889.png

转载于:https://www.cnblogs.com/LinTeX9527/p/3994795.html

你可能感兴趣的文章
为什么你招聘不到程序员,以及软件如何定义现实世界
查看>>
雷林鹏分享:PHP 面向对象
查看>>
图片按质量压缩
查看>>
从JavaScript执行上下文理解变量提升
查看>>
已经菜到不行了 PAT 1010. Radix (25)
查看>>
洛谷P4362 贪吃的九头龙
查看>>
javascript--函数参数与闭包--详解
查看>>
采用Jenkins搭建持续集成环境
查看>>
Mac常用软件大全, 6-18特惠 ,限时降价,需要的看看吧
查看>>
RabbitMQ 学习笔记
查看>>
小功能---天气预报
查看>>
[转载]你知道我今天为什么来公司上班吗?
查看>>
Json(JavaScript Object Notation)。
查看>>
一起谈.NET技术,ASP.NET缓存全解析6:数据库缓存依赖
查看>>
跑带宽度多少合适_GREATFOREST柜子:衣柜门宽度多少合适?
查看>>
confluence迁移后文件打不开_U盘打不开,提示格式化怎么办?
查看>>
nike附近门店查询_开汽修门店前做好以下几点,让您的门店如鱼得水
查看>>
华为荣耀8x云相册不见了_华为荣耀8X手机密码界面奇葩重启,维修神器快速搞定,你用过吗?...
查看>>
擦地机器人修理_擦地机的拖布是否需自动清洗?专家说法来了
查看>>
设置webhook_产品更新|自动外呼任务支持策略外显,新增工单webhook中间件及查询、编辑工单等OpenAPI接口...
查看>>