`w`命令如何知道空闲时间和正在运行的命令?

`w`命令如何知道空闲时间和正在运行的命令?

w命令显示了一系列有关谁登录了他们正在做什么的信息。

示例来自维基百科:

$ w
 11:12am up 608 day(s), 19:56,  6 users,  load average: 0.36, 0.36, 0.37
User     tty       login@  idle  what
smithj   pts/5      8:52am       w
jonesm   pts/23    20Apr06    28 -bash
harry    pts/18     9:01am     9 pine
peterb   pts/19    21Apr06       emacs -nw html/index.html
janetmcq pts/8     10:12am 3days -csh
singh    pts/12    16Apr06  5:29 /usr/bin/perl -w perl/test/program.pl

我知道它从以下位置获取前 3 列信息utmp 和 wtmp,它对所有人都有读取权限,但是它从哪里获取信息闲置的时间和什么用户当前正在执行的操作

ls -l $(which w)显示该w程序没有设置 setuid 位,并且作为普通用户,我无权查看/proc.

答案1

至少在 Linux 上,由于终端上的任何用户输入都将访问当前用户设备,因此它会调用stat()/dev/{tty,pts/}?*检查atime登录用户。

w.c

    /* stat the device file to get an idle time */
    static time_t idletime(const char *restrict const tty)
    {
            struct stat sbuf;
            if (stat(tty, &sbuf) != 0)
                    return 0;
            return time(NULL) - sbuf.st_atime;
    }

    static void showinfo(utmp_t * u, int formtype, int maxcmd, int from,
    ...
            print_time_ival7(idletime(tty), 0, stdout);
    ...

stat()只需要x父目录的执行()权限即可工作。

相关内容