首页 > 编程语言 >编程实现who指令

编程实现who指令

时间:2023-10-11 09:44:05浏览次数:34  
标签:文件 编程 int who 指令 printf include open

实现who命令

编写who程序时,需要做两件事:

1.从文件(/var/run/utmp)中读取数据结构信息
2.以合适的形式将结构中的信息显示出来

第一步读取信息

从某个文件中读取数据,Linux系统提供了三个系统函数:open()、read()、close()。

open打开一个文件

open在Linux下的定义以及调用函数所需的头文件如下

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);


函数第一个参数pathname,是要打开的文件的路径名或者文件名。

第二个参数flags,表示打开文件的操作模式(有3种):只读(O_RDONLY)、只写(O_WRONLY)、可读可写(O_RDWR),调用此函数时,必须指定其中一种。还有其他可选模式,暂不做介绍。

第三个参数mode,表示设置文件访问权限的初始值,和用户掩码umask有关。此文暂时不用这个参数。

打开文件时,如果操作成功,内核会返回一个正整数的值,这个数值叫做文件描述符。如果内核检测到任务错误,这个系统调用会返回-1。

要对一个文件进行操作(读或者写),必须先打开文件。文件打开成功后,可以通过文件描述符对文件进行操作。

read()从文件读取数据

read在Linux下的定义以及调用函数所需的头文件如下:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);


函数第一参数fd,为文件描述符,由open函数返回。

第二个参数buf,存放读取数据的内存空间。

第三个参数count,希望读取的数据的个数。

如果读取成功,返回所读取数据的字节个数;否则,返回-1。

注意:最终读取的数据可能没有要求的多。例如,文件中剩余的数据少于要求读取的个数,则程序只能读取文件中剩余的数据个数。当读到文件末尾时,函数会返回0。

close关闭文件

clsoe在Linux下的定义以及调用函数所需的头文件如下:

#include <unistd.h>

int close(int fd);


close 这个系统函数会关闭已经打开的文件,fd为open()函数打开文件返回的描述符。如果关闭出错,函数返回-1。关闭成功,则返回0。

对文件的操作完成后,需要关闭文件,以减少内存资源占用。

第二步显示信息

通过printf函数利用定宽度的格式显示utmp记录信息。

第三步代码实现

#include<stdio.h>
#include<utmp.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>

#define SHOWHOST

void show_info(struct utmp *utbufp);

int main()
{
    struct utmp current_record;
    int utmpfd;
    int reclen = sizeof(current_record);

    if((utmpfd = open(UTMP_FILE, O_RDONLY)) == -1)
    {
        perror(UTMP_FILE);
        exit(1);
    }
    while(read(utmpfd, &current_record, reclen) == reclen)
    {
        show_info(&current_record);
    }
    close(utmpfd);

    return 0;
}

// 显示信息
void show_info(struct utmp *utbufp)
{
    printf("%-8.8s", utbufp->ut_name);
    printf(" ");
    printf("%-8.8s", utbufp->ut_line);
    printf("%10d", utbufp->ut_time);
    printf(" ");

#ifdef SHOWHOST
    printf("(%s)", utbufp->ut_host);
#endif

    printf("\n");
}


编译
$gcc who1.c -o who1
运行结果如下

$./who1
reboot ~ 1635728912 (4.15.0-161-generic)
runlevel ~ 1635729058 (4.15.0-161-generic)
user :0 1635729148 (:0)
test pts/2 1635763291 (192.168.0.104)

将上述输出结果与系统who命令输出做对比:

$ who
user :0 2021-11-01 09:12 (:0)
test pts/2 2021-11-01 18:41 (192.168.0.104)

标签:文件,编程,int,who,指令,printf,include,open
From: https://www.cnblogs.com/xiaoquancheng/p/17756307.html

相关文章

  • Apple 推出全球开发者资源 —— 人人能编程
    近日,Apple宣布推出MeetwithAppleExperts开发者资源,帮助全球Apple开发者社区发现并参与课程、研讨会、实验室、一对一咨询等体验。MeetwithAppleExperts初期提供超过50个课程、研讨会和咨询项目,并将持续提供线上和线下活动,开发者也可借助该平台和Apple专家......
  • ACS系列(4) ACSPL+ 运动控制编程
    轴电机运动管理命令ENABLE&DISABLE   Enable命令激活一个或多个电机和轴   Disable命令关闭一个或多个电机轴。错误码存储在MERR中,可以用FCLEAR来清除只要是电机是使能的,控制器器提供下面工作:1)保持ENA电机在激活状态2)计算PE(非关键性的位置错误)3)执行闭环控制(对于伺服......
  • 【Android面试】2023最新面试专题六:Java并发编程(一)
    1、假如只有一个cpu,单核,多线程还有用吗?详细讲解享学课堂移动互联网系统课程:架构师筑基必备技能《线程与进程的理论知识入门1》这道题想考察什么?是否了解并发相关的理论知识考察的知识点cpu多线程的基本概念操作系统的调度任务机制CPU密集型和IO密集型理论考生应该如何回答CPU的执......
  • Python并发及网络编程进阶
    案例引入假如你们一家已上市的电商公司,在元旦来临前夕,领导需要你模拟用户,通过接口生成10万笔新订单。你该如何处理?方案探索串行:多个任务逐个执行的过程,上个任务执行完成前,阻塞下一个任务执行。并发:多个任务交替执行的过程,这些任务可能在同一时间段内执行,但是它们的执行时......
  • Python函数式编程进阶
    函数式编程函数式编程是一种基于函数的编程范式,它通过编写函数来描述程序的行为。函数被视为一等公民,可以作为参数、返回值和变量来使用。函数式编程通常使用高阶函数、不可变数据和递归等技术来描述程序的行为。命令式编程:基于指令的编程范式,它通过编写一系列指令来描述程......
  • 编译型编程语言与解释型编程语言的区别
    我们先看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一......
  • TIOBE 发布 2023年10 月编程语言排行榜:Java 占比下跌 3.92%成第四
    转载TIOBE发布10月编程语言排行榜:Java占比下跌3.92%成第四(msn.cn)本月Python、C、Java均有所下跌,而Java的跌幅最大,为-3.92%,掉到第四,而C#的涨幅最大,增长了3.29%。对此,TIOBE的CEOPaulJansen认为,C#和Java之间的差距从未如此之小,Java受欢迎程度下降的主要......
  • 单步指令区别step next stepi nexti
    https://blog.csdn.net/weixin_43092232/article/details/106243657https://blog.csdn.net/www_dong/article/details/117374370 代码验证:龙芯3A5000验证$cattest.c#include<stdio.h>intadd(intd1,intd2){intd;d=d1+1;d=d+d2+2;retu......
  • 8种品牌PLC单片机使用Socket编程实现以太网开放式通信服务器视频教程
    8种品牌PLC单片机使用Socket编程实现以太网开放式通信服务器视频教程一、罗克韦尔ABMicro850系列PLC实现ModbusTCP以太网通信协议​服务器视频教程:罗克韦尔ABMicro850系列PLC做ModbusTCP以太网通信服务器、以太网调试助手和ModbusPoll调试助手做ModbusTCP以太网通信客户端,......
  • UAV2101~UAV2105编程与仿真51MCU初学者训练
    练习001:51单片机Proteus仿真:点亮一个灯1、器件清单Proteus关键词元器件CAP固定电容CAP-ELEC电解电容AT89C51AT89C51单片机CRYSTAL晶振BUTTON复位按键RES电阻RESPACK排阻LED-YELLOW黄色发光二极管2、电路3、代码#include<reg51.h>/......