分类: LINUX
2006-11-02 09:35:56
其实在Linux下想看到谁登陆在自己的机器上,用w或者who命令即可查看,(如图一)
图一
从图一中可以看出有4个人在使用当前这台Linux。who和w命令可以作到,如果想知道如何使用who命令或者w,可以查看手册(即man,manual的缩写,使用手册,man也是一个命令。我们可以通过man来查看很多信息,例如查看printf的信息,可以输入man printf,就可以查看prinf的信息,当然,前提是printf在系统中有手册。Man还分各种章节,例如man 1 printf是查看用户工具 man 2 write是查看系统调用,man 3printf是查看C函数库调用,4是查看设备驱动程序信息,5是查看配置文件,6是查看游戏,7是查看软件包,8是查看系统工具。如果想对man有更多的了解,还可以输入命令#man man来获得):
[root@localhost root]#man w (查看w命令的手册)
[root@localhost root]#man who (查看who命令的手册)
这样就可以得到相应的信息(如图二)
图二
下面介绍一下如何编写这样的程序,通过查看who的命令文档可以查看到登陆用的信息被记录到了/var/run/utmp,/var/log/wtmp文件中,关于相关的结构可以在/usr/include/utmp.h下查看,在该文件中包含了一个头文件#include
struct utmp
{
short int ut_type; /* 登陆的类型(在后面会列出相应的类型). */
pid_t ut_pid; /*登陆的进程ID */
char ut_line[UT_LINESIZE]; /* 设备名,也就是我们说的TTY的名 */
char ut_id[4]; /* Inittab ID. */
char ut_user[UT_NAMESIZE]; /* Username. */
char ut_host[UT_HOSTSIZE]; /* 登陆人的主机名. */
struct exit_status ut_exit; /* 登出信息,例如死机等*/
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
int32_t ut_session; /* 会话ID */
struct
{
int32_t tv_sec; /* 秒. */
int32_t tv_usec; /*微秒 */
} ut_tv; /* 时间的结构名 */
#else
long int ut_session; /* 会话ID */
struct timeval ut_tv; /* 登陆时间 */
#endif
int32_t ut_addr_v6[4]; /* 登陆者的主机. */
char __unused[20]; /* Reserved for future use. */
};
结构中包含了登陆的类型,拥护名,主机名,登陆时间,登陆的控制台等等!下面再来看一看登陆类型的结构:
#define EMPTY 0 /*没有任何信息的类型 */
#define RUN_LVL 1 /* 系统运行的级别的类型 */
#define BOOT_TIME 2 /* 系统引导的类型 */
#define NEW_TIME 3 /* 系统时间更改后的类型 */
#define OLD_TIME 4 /* 正在更改的时间的类型. */
#define INIT_PROCESS 5 /* 初始化进程的类型. */
#define LOGIN_PROCESS 6 /* 正在等待或者验证登陆的类型 */
#define USER_PROCESS 7 /* 已经登陆的用户(本文主要用的是这个) */
#define DEAD_PROCESS 8 /* 退出(登出)的类型 */
类型分别为空,runlevel,reboot,newtime,oldtime,initprocess,login,用户等等,本文主要介绍的是USER_PROCESS这一项。如果要记录用户登陆的时间的话,当然就要用到时间的函数,也就是ctime函数,函数从/usr/include/time.h里面可以找到:
extern char *ctime (__const time_t *__timer) __THROW;
主要的操作还是打开文件和读取文件,也就是open和read函数,打开的文件是/var/run/utmp。在/usr/include/paths.h里面有定义。同时也可以查看到各种路径的定义。
下面开始编写简单的程序:
#include
#include
#include
#include
#include
void Timeformat(long timearg)
{
char *p; /*声明一个指针变量,在后面用来存放时间的地址*/
p=ctime(&timearg); /*格式化时间*/
printf("%12.12s\n", p+4); /*ctime返回的字符串从第四个字符开始*/
}
/*以上为格式化输出时间*/
void Showmessage(struct utmp * utmparg)
{
if(utmparg->ut_type != USER_PROCESS)/*判断登陆类型时候是“用户”*/
return;
printf("灵鸠剑客 give you the who message\nthe program written by 灵鸠剑客\n");
printf("%-8.8s", utmparg->ut_name ); /*输出登陆的用户名*/
printf(" ");
printf("%-8.8s",utmparg->ut_line); /*输出登陆的TTY*/
printf(" ");
Timeformat(utmparg->ut_time); /*输出登陆的时间*/
}
/*以上为输出当我们输入who命令后输出的信息*/
int main()
{
struct utmp pointer; /*声明utmp结构变量*/
int utmpfd; /*打开的utmp文件存放在这里*/
int re=sizeof(pointer);
if((utmpfd = open(UTMP_FILE, O_RDONLY)) == 1){/*打开utmp文件,前面说过UTMP_FILE文件在paths.h中有定义*/
printf("error\n");
exit(1);
}
while( read(utmpfd, &pointer, re) == re)/*读取文件中的内容*/
Showmessage(&pointer); /*调用Showmessage函数*/
close(utmpfd); /*关闭utmp文件*/
return 0;
}
下面来运行一下我们自己写的who程序看一看。(如图三)
关于who程序的编写到这里就结束了,虽然本文没有介绍w的编写,但是w的编写可以根据上面的代码自己进行修改即可!who命令虽然简单,但是他却可以查看谁在使用这台Linux。