Understanding Unix/Linux Programming-who指令练习

  1 /*Apply a Buffer trick in who3.c*/
  2
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <utmp.h>
  6 #include <fcntl.h>
  7 #include <unistd.h>
  8 #include <time.h>
  9
 10 #define NRECS 16
 11 #define NULLUT ((struct utmp * ) NULL )
 12 #define UTSIZE (sizeof(struct utmp))
 13
 14 #define SHOWHOST
 15
 16 static char utmpbuf[NRECS * UTSIZE] ;
 17 static int  num_recs ;
 18 static int  cur_rec ;
 19 static int fd_utmp = -1 ;
 20
 21 void show_info(struct utmp * utbufp) ;
 22 void show_time(time_t timeval);
 23
 24 int utmp_open(char *);
 25 int utmp_reload(void);
 26 struct utmp * utmp_next(void);
 27 void utmp_close(void);
 28
 29 int main(){
 30     struct utmp * utbufp ;
 31     struct utmp * utmp_next() ;
 32
 33     if( utmp_open( UTMP_FILE ) == -1 ){
 34         perror(UTMP_FILE );
 35         exit(1);
 36     }
 37
 38     while( (utbufp = utmp_next()) != ((struct utmp * ) NULL)){
 39         show_info(utbufp);
 40     }
 41
 42     utmp_close();
 43     return 0 ;
 44
 45 }
 46
 47 void show_info(struct utmp * utbufp ){
 48     if( utbufp->ut_type != USER_PROCESS)
 49         return;
 50
 51     printf("%-8.8s" , utbufp->ut_name );
 52     printf(" ");
 53     printf("%-8.8d" , utbufp->ut_type );
 54     printf(" ");
 55     printf("%-8.8s" , utbufp->ut_line);
 56     printf(" ");
 57     show_time(utbufp->ut_time);
 58
 59 #ifdef SHOWHOST
 60     printf("(%s)", utbufp->ut_host);
 61 #endif
 62     printf("\n");
 63     //printf("One Done!\n");
 64
 65 }
 66
 67 void show_time(long timeval)
 68 {
 69     char * cp ;
 70     cp = ctime(& timeval);
 71     printf("%12.12s" , cp + 4 );
 72 }
 73
 74 int utmp_open( char * filename ){
 75     fd_utmp = open(filename , O_RDONLY );
 76 }
 77
 78 struct utmp * utmp_next(void){
 79     struct utmp * recp ;
 80     if( fd_utmp == -1 ){
 81         return NULLUT ;
 82     }
 83     if( cur_rec == num_recs && utmp_reload() == 0 ){
 84         return NULLUT ;
 85     }
 86
 87     recp = (struct utmp * ) & utmpbuf[cur_rec * UTSIZE];
 88     cur_rec ++ ;
 89     return recp ;
 90 }
 91
 92 int utmp_reload(void)
 93 {
 94     int amt_read ; // file read , fd
 95     amt_read = read(fd_utmp , utmpbuf , NRECS * UTSIZE );
 96     num_recs = amt_read/UTSIZE ;
 97     cur_rec = 0 ;
 98     return num_recs ;
 99 }
100
101 void utmp_close(void){
102     if(fd_utmp != -1 ){
103         close(fd_utmp );
104     }
105 }

就不加注释啦,书本上并没有给出完整代码,我就简单完善下啦。

简单地运用了缓冲的思想。

在OpenSuse Leap42.1下编译运行通过。

来自为知笔记(Wiz)

时间: 2024-10-01 09:29:37

Understanding Unix/Linux Programming-who指令练习的相关文章

Understanding Unix/Linux Programming-文件、设备和流

每个设备文件都支持系统调用 ioctl: 目标:控制一个设备 头文件:#include<sys/ioctl.h> 函数原型:int result = ioctl(int fd , int operation [,arg...]); 参数 fd : 文件所关联的文件描述符 operation:操作类型 arg:可选参数 result:-1即错误:0即正确: 实际上,任何数据的源或者目的地都被Unix视为文件来处理,基本的系统调用既支持磁盘文件,也适用于设备文件.它们的区别体现在对于连接的操作上.

Understanding Unix/Linux Programming-stty指令练习

先来看一个简单的练习程序: 1 #include <stdio.h> 2 3 int main() 4 { 5 int c , n = 0 ; 6 while( (c = getchar() ) != 'Q' ) 7 printf("char %3d is %ccode %d\n" , n++ , c , c ); 8 return 0 ; 9 } 以上是程序编译后运行的效果啦,可以看到在输入hello之后敲击回车后才运行了该程序,也就是说,在终端中输入的字符实际上是被缓冲

UNIX/Linux下C语言的学习路线

一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD.RedHat Linux.SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等. 如果您一直使用Window

Unix Linux 通用vi命令,使用帮助手册【珍藏版

Unix Linux 通用vi命令,使用帮助手册[珍藏版] Vi 简介 Vi 是 Unix 世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台 Unix 机器都会提供这套软体.Linux 当然也有,它的 vi 其实是 elvis(版权问题),不过它们都差不多.熟悉 DOS 下的文书处理後,也许会感到 vi 并不好用:Unix 上也已经发展出许多更新.更好用的文书编辑器,但是并不一定每一台 Unix 机器上都会安装这些额外的软体.所以,学习 vi 的基本操作还是有好处,让你在各个不同的机器上得心

来自Unix/Linux的编程启示录

2017年第一篇文章,祝各位好友新年快乐. 年前由于不小心坐到了自己左手大拇指导致轻微的骨裂,没有按时更新,实在是惭愧.今年给自己订了个小目标,在安顿好新工作后,每周一篇来总结这些年所学. 话不多说,步入正题 写本文的最初灵感源于16年11月份我将工作环境切换到Mac OS上,其中一些使用"差异"让我开始对Unix/Linux中设计产生了浓厚的兴趣. 在整个探究过程中,那些经典的著作再次让我获益匪浅:C和指针,C专家编程,深入理解计算机系统(原书第3版),Linux/Unix设计思想,

Unix Linux vi vim 使用手册|vi vim 常用命令 详解

Unix Linux vi vim 使用手册 Vi 简介 Vi 是 Unix 世界里极为普遍的全萤幕文书编辑器,几乎可以说任何一台 Unix 机器都 会提供这套软体.Linux 当然也有,它的 vi 其实是 elvis(版权问题),不过它们都 差不多.熟悉 DOS 下的文书处理後,也许会感到 vi 并不好用:Unix 上也已经发展出 许多更新.更好用的文书编辑器,但是并不一定每一台 Unix 机器上都会安装这些额外 的软体.所以,学习 vi 的基本操作还是有好处,让你在各个不同的机器上得心应手.

获得Unix/Linux系统中的IP、MAC地址等信息

获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 作者:diaoyf  |  文章来源:http://programmerdigest.cn 实际环境和特殊需求往往会将简单问题复杂化,比如计算机IP地址,对于一个连接中socket,可以直接获得本端和对端的IP.端口信息.但在一些特殊场合我们可能需要更多的信息,比如系统中有几块网卡,他们的Mac地

Unix/Linux环境C编程入门教程(5) Red Hat Enterprise Linux(RHEL)环境搭建

Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. Red Hat Enterprise Linux是Red Hat公司的Linux发行版,面向商业市场,包括大型机.红帽公司从Red Hat Enterprise Linux 5开始对企业版LINUX的每个版本提供10年的支持[1].而Red Hat Enterprise Linux常简作RHEL. 1. 启动Vmware,如果没有安装的话,请看前面VMware安装的视频 2.选中

linux 的shell指令操作

1.在命令终端来获取root用户权限 在终端中输入: sudo passwd root Enter new UNIX password: (在这输入你的密码) Retype new UNIX password: (确定你输入的密码) passwd: password updated successfully 以后,如果在想获得root权限,只需进行如下的操作: su root Password: (在此输入你上面设置的密码) 如果要再次禁用 root 帐号, 那么可以执行 sudo passwd