Linux ac命令C/C++实现(输出用户连接时间)

在Linux中ac 命令显示有关用户连接到系统的时间量的统计信息。根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连接的时间。

linux ac命令

ac 命令根据当前 wtmp 文件中的登录/注销打印出连接时间报告(以小时为单位)。 总数也会被打印出来。

ac [options]

在这里插入图片描述它的主要参数有两个:

1、 -d将显示每天的连接时间。
2、 -p将显示每个用户的连接时间。

在这里插入图片描述
1、获取每日总数:

在这里插入图片描述
为每天输出输出一个总计时间,而不是在结尾输出一大的总计。
在这里插入图片描述
2、获得用户的连接时间:

为每个用户输出总计时间,并在最后追加一个所有用户的总计时间的 累计值。
在这里插入图片描述
输出的是在用户列表中包括的所有用户的连接时间的总计和值。

3、日期(含年份)显示所有用户的登录总时间:

在这里插入图片描述

在显示日期的时候输出年份。

4、根据日期显示每个用户的登录总时间:

在这里插入图片描述
统计结果单位为小时。

ac命令的登陆时间

函数 login() 获取提供的 struct utmp, ut,并将其写入 utmp 和 wtmp 文件。 utmp 文件记录了当前使用系统的人员。 wtmp 文件记录所有登录和注销。
在这里插入图片描述
ac命令的注销时间

在这里插入图片描述
logout() 函数在 utmp 文件中搜索匹配 ut_line 参数的条目。如果找到记录,则通过将 ut_name 清零来更新它和 ut_host 字段,更新 ut_tv 时间戳字段并将 ut_type(如果有这样的字段)设置为 DEAD_PROCESS。

Linux ac命令C/C++实现

int main(int argc, char **argv) 
{
	wtmp = "/var/log/wtmp";
	while (--argc > 0 && **++argv == '-')
	switch(*++*argv) 
	{
		case 'd':
			byday++;
			continue;

		case 'w':
			if (--argc>0)
				wtmp = *++argv;
			continue;

		case 'p':
			pflag++;
			continue;
	}
	pcount = argc;
	pptr = argv;
	if ((wf = fopen(wtmp, "r")) == NULL) 
	{
		printf("No %s\n", wtmp);
		return -1;;
	}
	for(;;) 
	{
		if (fread((char *)&ibuf, sizeof(ibuf), 1, wf) != 1)
			break;
		fl = 0;
		for (i=0; i<8; i++) 
		{
			c = ibuf.ut_name[i];
			if(isdigit(c) || isalpha(c)) 
			{
				if (fl)
					goto skip;
				continue;
			}
			if (c==' ' || c=='\0') 
			{
				fl++;
				ibuf.ut_name[i] = '\0';
			} 
			else
				goto skip;
		}
		loop();
    skip:;
	}
	ibuf.ut_name[0] = '\0';
	ibuf.ut_line[0] = '~';
	time((time_t *)&ibuf.ut_time);
	loop();
	print();
	return 0;
}

编译运行:

在这里插入图片描述
在这里插入图片描述
总结

ac 命令显示有关用户连接到系统的时间量的统计信息。更多详细信息请查看man ac手册。

欢迎关注微信公众号【程序猿编码】,需要ac 命令完整源码的添加本人微信号(c17865354792)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值