C语言中操作utmp文件的相关函数用法

 更新时间:2015年08月28日 16:08:08   投稿:goldensun  
这篇文章主要介绍了C语言中操作utmp文件的相关函数用法,包括getutent()函数和setutent()函数以及endutent()函数,需要的朋友可以参考下

C语言getutent()函数:从utmp文件中取得账号登录数据
头文件:

#include <utmp.h>

定义函数:

struct utmp *getutent(void);

函数说明:getutent()用来从utmp 文件(/var/run/utmp)中读取一项登录数据, 该数据以utmp 结构返回. 第一次调用时会取得第一位用户数据, 之后每调用一次就会返回下一项数据, 直到已无任何数据时返回NULL。

utmp 结构定义如下:

struct utmp
{
  short int ut_type; //登录类型
  pid_t ut_pid; //login 进程的pid
  char ut_line[UT_LINESIZE]; //登录装置名, 省略了"/dev/"
  char ut_id[4]; //Inittab ID
  char ut_user[UT_NAMESIZE]; //登录账号
  char ut_host[UT_HOSTSIZE]; //登录账号的远程主机名称
  struxt exit_status ut_exit; //当类型为DEAD_PROCESS 时进程的结束状态
  long int ut_session; //Sessioc ID
  struct timeval ut_tv; //时间记录
  int32_t ut_addr_v6[4]; //远程主机的网络地址
  char __unused[20]; //保留未使用
};

ut_type 有以下几种类型:

  • EMPTY:此为空的记录.
  • RUN_LVL:记录系统run-level 的改变
  • BOOT_TIME:记录系统开机时间
  • NEW_TIME:记录系统时间改变后的时间
  • OLD_TINE:记录当改变系统时间时的时间.
  • INIT_PROCESS:记录一个由init 衍生出来的进程.
  • LOGIN_PROCESS:记录 login 进程.
  • USER_PROCESS:记录一般进程.
  • DEAD_PROCESS:记录一结束的进程.
  • ACCOUNTING:目前尚未使用.

exit_status 结构定义:

struct exit_status
{
  short int e_termination; //进程结束状态
  short int e_exit; //进程退出状态
};

timeval 的结构定义请参考gettimeofday()。

相关常数定义如下:

  • UT_LINESIZE 32
  • UT_NAMESIZE 32
  • UT_HOSTSIZE 256

返回值:返回 utmp 结构数据, 如果返回NULL 则表示已无数据, 或有错误发生.

附加说明:getutent()在第一次调用时会打开utmp 文件, 读取数据完毕后可使用endutent()来关闭该utmp文件.

范例

#include <utmp.h>
main()
{
  struct utmp *u;
  while((u = getutent()))
  {
    if(u->ut_type == USER_PROCESS)
      printf("%d %s %s %s \n", u->ut_type, u->ut_user, u->ut_line, u->ut_host);
  }
  endutent();
}

执行
//表示有三个root 账号分别登录/dev/pts/0, /dev/pts/1, /dev/pts/2
7 root pts/0
7 root pts/1
7 root pts/2

C语言setutent()函数:从头读取utmp文件中的登录数据
头文件:

#include <utmp.h>

定义函数:

void setutent(void);

函数说明:setutent()用来将getutent()的读写地址指回utmp 文件开头。

C语言endutent()函数:关闭文件(关闭utmp文件)
头文件:

#include <utmp.h>

定义函数:

void endutent(void);

函数说明:endutent()用来关闭由getutent 所打开的utmp 文件。

范例:请参考getutent().

相关文章

  • 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结

    深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结

    本篇文章是对C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程进行了总结与分析,需要的朋友参考下
    2013-05-05
  • C语言中随机数rand()函数详解

    C语言中随机数rand()函数详解

    大家好,本篇文章主要讲的是C语言中随机数rand()函数详解,感兴趣的同学感快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言实现实时钟表

    C语言实现实时钟表

    这篇文章主要为大家详细介绍了C语言实现实时钟表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 构造函数定义为private或者protected的好处

    构造函数定义为private或者protected的好处

    从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。对于protected的函数,子类的“内部”的其他函数可以调用之。而对于private的函数,只能被本类“内部”的其他函数说调用
    2013-10-10
  • C++中的for-each循环使用

    C++中的for-each循环使用

    范围循环是C++11引入的特性,用于简化数组和容器的遍历过程,它通过直接操作元素而不是使用索引或迭代器,范围循环可以使用引用或const修饰符来控制元素的修改权限,适用于所有支持begin()和end()方法的容器,该循环方式不适用于未提供这些方法的C++98/03容器
    2024-09-09
  • C语言的Struct Hack笔记

    C语言的Struct Hack笔记

    这篇文章主要介绍了C语言的Struct Hack例子,个人的一篇笔记,需要的朋友可以参考下吧
    2014-04-04
  • C++基于控制台实现的贪吃蛇小游戏

    C++基于控制台实现的贪吃蛇小游戏

    这篇文章主要介绍了C++基于控制台实现的贪吃蛇小游戏,实例分析了贪吃蛇游戏的原理与C++实现技巧,是非常经典的游戏算法,需要的朋友可以参考下
    2015-04-04
  • C++如何动态的生成对象详解

    C++如何动态的生成对象详解

    C++是不支持根据类名动态地生成对象的,比如从一个文本文件中读取类名然后构造一个对象.主要原因是没有丰富的动态元信息,没有单根类库。那么下面这篇文章就来给大家介绍C++是如何动态的生成对象,有需要的朋友们可以参考借鉴。
    2017-02-02
  • C++判断pe文件实例

    C++判断pe文件实例

    这篇文章主要介绍了C++判断pe文件的方法,包含了文件操作的具体实现方法,具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C语言实现的猜数字小游戏

    C语言实现的猜数字小游戏

    这篇文章主要为大家详细介绍了C语言实现的猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01

最新评论