编程实现linux中的who命令功能

fiy 其他 7

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    要实现Linux中的who命令功能,首先需要了解who命令的功能和使用方法。who命令用于显示当前登录系统的用户信息,包括用户名、登录时间、登录终端等。

    在Linux系统中,可以使用C语言进行编程来实现who命令。以下是实现该功能的大致步骤:

    1. 使用系统调用函数打开”utmp”文件,该文件记录了当前登录系统的用户信息。

    2. 读取”utmp”文件中的记录,并解析出所需的用户信息,例如用户名、登录时间、登录终端等。

    3. 将解析得到的用户信息打印输出。

    4. 关闭”utmp”文件。

    下面是一个简单的C语言示例代码来实现类似who命令的功能:

    “`
    #include
    #include

    int main() {
    struct utmp ut;
    FILE *fp;

    if ((fp = fopen(“/var/run/utmp”, “rb”)) == NULL) { // 打开utmp文件
    perror(“Open file error”);
    return 1;
    }

    while (fread(&ut, sizeof(struct utmp), 1, fp) == 1) { // 读取utmp文件记录
    if (ut.ut_type == USER_PROCESS) { // 只处理登录用户记录
    printf(“User: %s\n”, ut.ut_user);
    printf(“Login time: %s\n”, ctime(&ut.ut_tv.tv_sec)); // 使用ctime函数将登录时间转换为字符串
    printf(“Terminal: %s\n\n”, ut.ut_line);
    }
    }

    if (fclose(fp) != 0) { // 关闭utmp文件
    perror(“Close file error”);
    return 1;
    }

    return 0;
    }
    “`

    上述代码中,使用了`struct utmp`结构体来表示utmp文件中的记录,其中`ut_type`表示记录类型,`ut_user`表示用户名,`ut_tv.tv_sec`表示登录时间,`ut_line`表示登录终端。

    需要注意的是,上述代码中以读取`/var/run/utmp`文件作为示例,实际上utmp文件的位置可能会有所不同,需要根据系统的不同进行调整。

    以上是一个简单的实现Linux中的who命令功能的示例代码,可以根据实际需求进行修改和优化。同时,还可以使用其他编程语言如Python来实现类似的功能。

    2年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    要实现Linux中的who命令功能,可以使用C语言编写程序。下面是一个简单的实现示例:

    “`c
    #include
    #include
    #include
    #include
    #include

    void show_info(struct utmp *utmp_buffer);

    int main()
    {
    int utmp_fd;
    struct utmp current_record;
    int record_size = sizeof(current_record);

    if ((utmp_fd = open(UTMP_FILE, O_RDONLY)) == -1)
    {
    perror(UTMP_FILE);
    exit(1);
    }

    while (read(utmp_fd, &current_record, record_size) == record_size)
    {
    show_info(&current_record);
    }

    close(utmp_fd);
    return 0;
    }

    void show_info(struct utmp *utmp_buffer)
    {
    if (utmp_buffer->ut_type == USER_PROCESS)
    {
    printf(“%-8.8s”, utmp_buffer->ut_user);
    printf(” “);
    printf(“%-8.8s”, utmp_buffer->ut_line);
    printf(” “);
    printf(“%12.12s”, ctime(&(utmp_buffer->ut_tv.tv_sec)));
    printf(” “);
    #ifdef SHOWHOST
    printf(“(%s)”, utmp_buffer->ut_host);
    #endif
    printf(“\n”);
    }
    }
    “`

    该程序包含了以下几个部分:

    1. 头文件:包括了`stdio.h`、`stdlib.h`、`utmp.h`、`fcntl.h`和`unistd.h`等必要的头文件。
    2. `show_info`函数:用于打印登录信息,包括用户名、终端线路、登录时间和登录主机。
    3. `main`函数:打开`/var/run/utmp`文件(保存当前登录用户信息的文件),循环读取每条记录并调用`show_info`函数进行打印。
    4. `show_info`函数的实现:首先判断记录类型是否为用户进程,如果是则打印相关信息,包括用户名、终端线路、登录时间和登录主机。
    5. 编译和执行:使用`gcc`编译程序并执行生成的可执行文件。

    该程序实现了基本的who命令功能,可以打印当前登录用户的相关信息。但是需要注意的是,由于Linux系统版本的不同,可能存在一些差异,但基本思路是相同的。

    2年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Linux系统中,who命令用于查看当前登录系统的用户信息。它会显示当前登录系统的用户名、终端、登录时间等信息。下面我们通过编程来实现类似的功能。

    首先,我们需要使用C语言来编写这个程序。下面是一个基本的示例代码:

    “`c
    #include
    #include
    #include
    #include
    #include

    int main(int argc, char *argv[]) {
    struct utmp *ut;
    time_t now;
    char *line;
    char *time_str;
    char *user;

    setutent(); // 打开utmp文件

    // 遍历utmp文件,获取用户信息
    while((ut = getutent()) != NULL) {
    if (ut->ut_type == USER_PROCESS) {
    // 获取用户名
    user = ut->ut_user;

    // 获取终端设备
    line = ut->ut_line;

    // 获取登录时间
    now = ut->ut_tv.tv_sec;

    // 将时间戳转换成字符串形式
    time_str = ctime(&now);

    // 打印用户信息
    printf(“%s\t%s\t%s\n”, user, line, time_str);
    }
    }

    endutent(); // 关闭utmp文件

    return 0;
    }
    “`

    上述代码使用了系统库中的utmp.h头文件,其中定义了utmp结构体,包含了用户登录信息的各个字段。代码中通过调用setutent()函数打开utmp文件,然后使用getutent()函数遍历utmp文件,获取所有用户登录信息。

    在代码中通过判断ut_type字段的值,筛选出登录用户的记录。用户信息包括用户名、终端设备和登录时间等。登录时间是以时间戳的形式保存的,我们通过ctime()函数将时间戳转换成字符串形式。

    最后,通过调用endutent()函数关闭utmp文件,释放资源。运行程序即可得到类似于who命令的输出结果。

    为了编译上述代码,可以使用gcc编译器,执行以下命令:

    “`
    gcc -o who who.c
    “`

    这将生成一个名为who的可执行文件。执行这个文件,即可获得当前登录系统的用户信息。

    上述代码实现了基本的who命令功能,但是并没有对输出结果进行格式化处理。可以根据需求进行进一步的调整和完善,比如按照指定的格式输出等。

    2年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部