Linux---who命令学习
who命令
获取正在登录系统的用户
使用Linux的who命令
第一个参数book代表用户名,第二个参数tty7代表终端名,第三个参数代表时间,第四个参数代表用户的登录地址。
阅读手册
使用命令读手册
$ man who
可以知道who这个命令从 /var/run/utmp 和 /var/log/wtmp 两个文件中获取数据,
再通过命令,查找关于 “utmp” 的信息
$ man -k utmp
-k的意思是根据关键字查找
$man 5 utmp
我们查询到一些关于utmp结构体中的元素,比如ut_user用户名字、ut_line用户设备、ut_time登录时间等。
who命令的工作流程
打开utmp
+----> 读取记录 ------ +
| |
+-------显示记录 |
关闭utmp <------ +
who命令的编写---版本1
#include <stdio.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h> void show_info(struct utmp *utbufp);
int main()
{
struct utmp current_record;
int utmp_fd;
int reclen = sizeof(current_record); utmp_fd = open(UTMP_FILE,O_RDONLY);
if(utmp_fd == -)
return -; while( read(utmp_fd, ¤t_record,reclen) == reclen )
show_info(¤t_record); close(utmp_fd);
return ;
} void show_info(struct utmp *utbufp)
{ printf("%-8.8s",utbufp->ut_name);
printf(" ");
printf("%-8.8s",utbufp->ut_line);
printf(" ");
printf("%101d",utbufp->ut_time);
printf(" ");
printf("(%s)",utbufp->ut_host);
printf(" ");
printf("\n");
}
输出结果:
问题:
1. 有部分数据不是真实用户的。
2. 时间显示不对。
解决方法:
1.第一个问题
继续使用命令
$ man 5 utmp
看到 ut_type中 USER_PROCESS表示的是已经登录的用户 ,那么第一个问题就解决了。
2.第二个问题
使用命令
$ man -k time | grep transform
看到ctime,使用命令查看ctime的使用方法
$ man 3 ctime
使用这个函数将 timeval转换成一个字符串并返回一个指针,那么第二个问题也解决了。
who命令的编写---版本2
#include <stdio.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h> void show_info(struct utmp *utbufp);
void show_time(long timeval);
int main()
{
struct utmp current_record;
int utmp_fd;
int reclen = sizeof(current_record); utmp_fd = open(UTMP_FILE,O_RDONLY);
if(utmp_fd == -)
return -; while( read(utmp_fd, ¤t_record,reclen) == reclen )
show_info(¤t_record); close(utmp_fd);
return ;
} void show_info(struct utmp *utbufp)
{
if(utbufp->ut_type != USER_PROCESS)
return; printf("%-8.8s",utbufp->ut_name);
printf(" ");
printf("%-8.8s",utbufp->ut_line);
printf(" ");
show_time(utbufp->ut_time);
printf(" ");
printf("(%s)",utbufp->ut_host);
printf("\n");
} void show_time(long timeval)
{
char *cp; cp = ctime(&timeval); printf("%12.12s",cp+); }
输出结果:
这样一个简单的who命令就完成了。
------------------------------于2019/5/5更新---------------------
改良who命令
在Linux---cp命令中,介绍了有关缓冲区和系统开销的知识,因此,我们可以改良自己编写的who命令。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <utmp.h> #define NRECS 16
#define NULLUT ((struct utmp*)NULL)
#define UTSIZE (sizeof(struct utmp)) static char utmpbuf[NRECS * UTSIZE];
static int num_recs;
static int cur_rec;
static int fd_utmp = -; struct utmp* utmp_next();
int utmp_reload();
int utmp_open(char *filename);
void utmp_close(); int utmp_open(char *filename)
{
fd_utmp = open(filename , O_RDONLY);
cur_rec = ;
num_recs = ;
return fd_utmp;
} struct utmp* utmp_next()
{
struct utmp* recp;
if(fd_utmp == -)
{
return NULLUT;
}
if(cur_rec == num_recs && utmp_reload() == )
{
return NULLUT;
} recp = (struct utmp*) &utmpbuf[cur_rec * UTSIZE];
cur_rec++;
return recp;
} int utmp_reload()
{
int aimt_read;
aimt_read = read(fd_utmp, utmpbuf, NRECS * UTSIZE);
num_recs = aimt_read / UTSIZE;
cur_rec = ;
return num_recs; } void utmp_close()
{
if(fd_utmp != -)
close(fd_utmp);
}
编写一个增大缓冲区的库,调用的次数减少到原来的1/16。这样程序能够在更短的时间内完成。
#include <stdio.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <stdlib.h> void show_info(struct utmp *utbufp);
void show_time(long timeval); #define SHOWHOST int main()
{
struct utmp* utbufp , *utmp_next();
if( utmp_open(UTMP_FILE) == -)
{
perror(UTMP_FILE);
exit();
} while( (utbufp = utmp_next()) != ((struct utmp *)NULL))
show_info(utbufp); utmp_close();
return ;
} void show_info(struct utmp *utbufp)
{
if(utbufp->ut_type != USER_PROCESS)
return; printf("%-8.8s",utbufp->ut_name);
printf(" ");
printf("%-8.8s",utbufp->ut_line);
printf(" ");
show_time(utbufp->ut_time);
printf(" ");
printf("(%s)",utbufp->ut_host);
printf("\n");
} void show_time(long timeval)
{
char *cp; cp = ctime(&timeval); printf("%12.12s",cp+); }
本篇笔记自拜读《 Unix/Linux编程实践教程》
我也推荐和我一样的初学者去拜读这本书,让你对linux有可下手的地方。
Linux---who命令学习的更多相关文章
- linux基础命令学习笔记(二)
linux基础命令学习笔记(二) 1.kill :终止进程 kill pid (唯一标示一个进程) kill -9 强制终止 kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...
- Linux常用命令学习4---(挂载命令mount umount、用户登陆查看和用户交互命令 w who last lastlog)
紧接着上一篇Linux的命令行的学习:Linux学习3---(文件的压缩和解压缩命令zip unzip tar.关机和重启命令shutdown reboot……) 1.挂载命令 简介 ...
- 【Linux】命令学习笔记和总结
莫名的想学习一下Linux了,因为对这方面的知识储备为0.对于命令行界面始终是零接触零了解,对一个程序员来说这几乎是致命的,所以简单了解一下. 一.教程参考 参考菜鸟教程即可: Linux 教程 | ...
- Linux常用命令学习
1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...
- linux sort命令学习
linux sort命令以行为单位对文本文件进行排序. 接下来我们会以/tmp/sort_test.txt这个文本文件为例对sort命令的用法进行说明. sh-# cat /tmp/sort_test ...
- linux source命令学习
1. linux source命令的作用? 我们可能经常需要修改到诸如/etc/profile,~/.bash_profile等这样的配置文件, 一方面我们希望所作的修改在当前的环境中立即生效: 另一 ...
- linux (ubuntu) 命令学习笔记
1, md5sum 输出字符串的MD5值 echo -n 123456 | md5sum //-n表示不打印回车符 2, ubuntu设置dock任务栏鼠标点击效果 16.04: 调整位置:gsett ...
- linux基础命令学习(六)文件的特殊属性
Linux chattr命令用于改变文件属性. 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: a:让文件或目录仅供附加用途. b:不更新文件或目录的最后存取 ...
- 五个知识体系之-Linux常用命令学习
1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...
- Linux常用命令学习随笔
1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...
随机推荐
- javascrip学习之基础
弹窗信息:三种消息框:警告框.确认框.提示框. window.alert("sometext"); var r=confirm("按下按钮");//提示信息,返 ...
- 3d Max 2016安装失败怎样卸载3dsmax?错误提示某些产品无法安装
安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).AUTODESK系列软件着实令人头疼,有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- maya2012无法安装卸载激活失败
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- UGUI 切割图片
1.图片设置为以下格式,然后点击Sprite Editor. 2.点击Slice. 3.再点击Slice. 4.效果图.
- [转]Jquery Mobile dialog的生命周期
本文转自:http://www.cnblogs.com/jackhuclan/archive/2012/04/05/2432972.html JQuery Mobile对htm5的移动开发绝对是个好用 ...
- 快速创建jquery插件
介绍 什么是插件? 插件我们见得很多了,比如浏览器上我们会安装一些去除广告的插件.美化页面的插件等等. 在前端,我们也常常写一些jquery插件来使用.来添加我们常常写的一些功能,方便使用. 为什么要 ...
- 操作符&流程控制
运算符:算术运算符 赋值运算符 字符串运算符 递增(++)和递减(--)运算符 逻辑运算符 比较运算符 三元运算符 1.算术运算符 算术运算符,用于完成各种算术运 ...
- Golang笔记(一)简洁的语言风格
Golang笔记(一)简洁的语言风格 概述 Golang继承了很多C语言的风格,寡人使用了十几年C语言,切换到Golang时上手很快,并且随着深入的使用,越来越喜欢这门语言.Golang最直观的感受是 ...
- Hibernate系列3-----之修改
只是修改测试类,先看其他的代码的同学,请翻看我的博客Hibernate1,嘿嘿,我就在这不在重写一遍来 @Test public void testhibernate() { updateStuden ...
- Snipaste的详细安装和使用
Snipaste安装和使用 1:snipaste的安装 步骤一: https://zh.snipaste.com/ ,去此官网下载. 步骤二:由于此是个绿色软件,直接解压即可. 步骤三:使用,见官网 ...