Linux编程实践Day2
关于命令who
解决windows下wsl中输入who没有任何反应的问题
- [1] CSDN
命令也是程序
在Unix系统中增加新的命令是一件很容易的事,把程序的可执行文件放到以下任意一个目录即可:/bin,/usr/bin,/usr/local/bin
问题1:who命令可以做什么
Linux系统中了解一个命令最好的方法便是使用man
命令,例如man who
![](/2023/09/06/Linux%E7%BC%96%E7%A8%8B%E5%AE%9E%E8%B7%B5Day2/pic1.png)
Unix联机帮助分为很多节,如第1小节中是关于用户命令的帮助,第2小节是关于系统调用的帮助,第5小节是关于配置文件的帮助
问题2:who命令是如何工作的
- 从Unix中学习Unix
- 阅读联机帮助
- 搜索联机帮助
- 阅读.h文件
- 从(SEE ALSO)得到启示
- 阅读联机帮助
通过阅读who的联机帮助可知,who命令本质上通过输出/var/run/utmp
文件来实现(不同系统文件夹可能不同)在Linux系统中,通常使用系统调用函数来实现打开文件,具体可以通过man open等命令查询
- utmp部分结构
1
2
3
4
5
6
7
8
9
10
11struct utmp {
short ut_type; /* Type of record */
pid_t ut_pid; /* PID of login process */
char ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */
char ut_id[4]; /* Terminal name suffix,
or inittab(5) ID */
char ut_user[UT_NAMESIZE]; /* Username */
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
kernel version for run-level
messages */
}
问题3:如何编写who
采用缓冲机制的who命令实现
执行命令gcc mywho.c utmpcache.c -o mywho
代码如下:
1 |
|
运行结果:
不幸的是,本机的wsl环境似乎有点问题,反正我不知道为什么,本机的login似乎会先让lrx用户登录,然后再登录另一个用户,(完全不知道为什么好么)如果谁有想法的话非常感谢555
![](/2023/09/06/Linux%E7%BC%96%E7%A8%8B%E5%AE%9E%E8%B7%B5Day2/pic4.png)
Linux编程实践Day2
http://bugeater.space/2023/09/06/Linux编程实践Day2/