当前位置:  技术问答>linux和unix

关于注销过程的困惑

    来源: 互联网  发布时间:2016-02-22

    本文导语:  小弟最近在看unix/linux编程实践教程,有一道课后题是实现ac命令。 我知道应该去查找wtmp文件中登录和注销记录,可是如何确定用户登录了多少时间却发了愁。 我看到一段文章关于注销过程描述如下: 登录时,login...

小弟最近在看unix/linux编程实践教程,有一道课后题是实现ac命令。
我知道应该去查找wtmp文件中登录和注销记录,可是如何确定用户登录了多少时间却发了愁。
我看到一段文章关于注销过程描述如下:

登录时,login程序填写这样一个结构,然后将其写入到utmp文件中,同时也将其添写到wtmp文件中。注销时, init进程将utmp文件中相应的记录擦除(每个字节都填以0 ),并将一个新记录添写到wtmp文件中。读wtmp文件中的该注销记录,其ut_name字段清除为0。在系统再启动时,以及更改系统时间和日期的前后,都在wtmp文件中添写特殊的记录项。
      
那么有两个问题我不太明白:
          1。既然注销时也把wtmp文件中的注销记录的ut_name字段清除为0,那么怎么知道是谁注销了呢?为什么要清除ut_name字段?
          2。注销时候往wtmp文件中写入了注销记录,那么如何确定这个用户登录了多长时间呢?
    
这两个问题困扰了我好长时间,各个论坛发帖也没有得到解决,希望在这里能够得到大家的帮助,不胜感激~



|
man里面说的很清楚。

       The  utmp  file allows one to discover information about who is currently
       using the system.  There may be more users currently  using  the  system,
       because not all programs use utmp logging.

       The wtmp file records all logins and logouts.  Its format is exactly like
       utmp  except  that  a null user name indicates a logout on the associated
       terminal.  Furthermore, the terminal name ~ with user  name  shutdown  or
       reboot  indicates  a  system  shutdown or reboot and the pair of terminal
       names |/} logs the old/new system time when date(1) changes it.  wtmp  is
       maintained  by login(1), init(1), and some versions of getty(8).  Neither
       of these programs creates the file, so if it is  removed,  record-keeping
       is turned off.

          struct utmp {
            short ut_type;              /* type of login */
            pid_t ut_pid;               /* PID of login process */
            char ut_line[UT_LINESIZE];  /* device name of tty - "/dev/" */
            char ut_id[4];              /* init id or abbrev. ttyname */
            char ut_user[UT_NAMESIZE];  /* user name */
            char ut_host[UT_HOSTSIZE];  /* hostname for remote login */
            struct exit_status ut_exit; /* The exit status of a process
                                           marked as DEAD_PROCESS */

            /* The ut_session and ut_tv fields must be the same size when
               compiled 32- and 64-bit.  This allows data files and shared
               memory to be shared between 32- and 64-bit applications */
          #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
            int32_t ut_session;         /* Session ID, used for windowing */
            struct {
              int32_t tv_sec;           /* Seconds */
              int32_t tv_usec;          /* Microseconds */
            } ut_tv;                    /* Time entry was made */
          #else
             long int ut_session;        /* Session ID, used for windowing */
             struct timeval ut_tv;       /* Time entry was made */
          #endif

            int32_t ut_addr_v6[4];       /* IP address of remote host */
            char __unused[20];           /* Reserved for future use */
          };

       This  manpage is based on the libc5 one, things may work differently now.



针对你的两个问题:
                    1。既然注销时也把wtmp文件中的注销记录的ut_name字段清除为0,那么怎么知道是谁注销了呢?为什么要清除ut_name字段?
                    2。注销时候往wtmp文件中写入了注销记录,那么如何确定这个用户登录了多长时间呢? 
1. 注销时不清wtmp里的记录。如果你说的是utmp的话,不清ut_name留着干什么?utmp只记录登录用户。
2. login时候记一次,logout时候记一次。时间差可以算出登录时间。

|
查看一下ac命令的源码不就什么都清楚了么?
man utmp详细描述了记录的详情,LZ仔细看看,结合ac的源码,应该没有什么问题的。

|
楼上正解.用的时间差

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 为什么我的LINUX, 刚刚装好, 就不能注销(注销就黑屏) , 如果想注销只能重新启动了?
  • 有什么办法让KDE注销时选择注销、重启还是关机?
  • 常见问题常见问题 搜索搜索 团队团队 个人资料个人资料 您没有新的站内信件您没有新的站内信件 注销 [ tnt_bomb ]注销 [ tnt_b
  • 注销和重新启动有什么区别?
  • 注销kde 到字符界面 键盘输入失效
  • 好像有点幼稚的问题:在“注销”时应该作些什么事?
  • 有没有做过注销的,我急用!!!!50分相送,肯定给分!
  • redhat注销之后怎么办?
  • 不小心远程注销了linux,然后再进去时桌面不见?急!!在线等,高手帮忙啊!
  • linux用户注销。高分请教~~~
  • linux命令行模式下怎么注销系统重新登陆呢用logout不行。,图形界面下就可以直接点击鼠标。
  • c#拦截关机注销消息的实现代码
  • 使用xp_cmdshell注销Windows登录用户(终端服务器超出最大连接数)
  • readhat linux 怎样从图形模式下注销,然后进入字符模式
  • java/j2ee iis7站长之家
  • UNIX中为什么重启或者注销之后,之前插入的环境变量PATH的值恢复到启动前的状态
  • c#调用api控制windows关机示例(可以重启/注销)
  • C#实现关机重启及注销实例代码


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3