1.背景

多次学习C语言一直无法踏入C语言的大门,每次都是在学习C语言中的那些系统调用库函数等望而却只,linux下的系统调用需要我们去记忆一些没有规律的结构体和一些大写的宏定义并且还有一个函数多种形式的例如print fprintf sprintf等等,看起来就很不爽,写起东西来真的很无语。什么都要自己写,写什么都要对返回结果进行出错处理的判断。(C语言菜鸟的一些抱怨勿喷),最近又重新拾起C来学习linux下的C编程。目前主要看linux程序设计(早年买的书),unix/linux编程实践(电子版) unix环境高级编程(电子版),准备入手unix/linux编程实践主要看这本书其他两本辅助来看。当我在看unix/linux编程实践的时候我先翻了一下目录很让我感觉耳目一新,不像是那种中规中矩的书,全书辅以实际例子来讲解,每一个例子都涉及了很多系统调用。通过例子不紧紧学习到了系统调用的使用还掌握了编程的技巧。最近才刚刚看到第二章,在第二章中该书讲解了如何通过linux联机帮助来解决编程问题,让我着实对这本书产生了很高的兴趣。不用一开始就去学习大量枯燥的系统调用和库函数就可以写出一些小程序。

2.怎么去实现

举个例子来说如何去实现who命令的编写的,对于我这样一个菜鸟实在不知道该如何下手。

1.那么第一步我该man who看看who命令本身是如何来实现的。

在man who的DESCRIPTION中找到了这样的一句话。

If FILE is not specified, use /var/run/utmp.  /var/log/wtmp as FILE is common

大致意思就是who是通过读取一个文件来显示信息的,如果不指定这个文件的话默认就是/var/run/utmp和/var/log/wtmp两个文件。

2.接着立刻搜索utmp wtmp相关的man信息

man -k utmp

man -k wtmp

搜索的结果均指向了#include

3.紧接着就看看这个头文件中包含了啥struct utmp {

short   ut_type;              /* Type of record */

pid_t   ut_pid;               /* PID of login process */

char    ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */

char    ut_id[4];             /* Terminal name suffix,

or inittab(5) ID */

char    ut_user[UT_NAMESIZE]; /* Username */

char    ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or

kernel version for run-level

messages */

struct  exit_status ut_exit;  /* Exit status of a process

marked as DEAD_PROCESS; not

used by Linux init(8) */

/* 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 (getsid(2)),

used for windowing */

struct {

int32_t tv_sec;           /* Seconds */

int32_t tv_usec;          /* Microseconds */

} ut_tv;                      /* Time entry was made */

#else

long   ut_session;           /* Session ID */

struct timeval ut_tv;        /* Time entry was made */

#endif

int32_t ut_addr_v6[4];        /* Internet address of remote

host; IPv4 address uses

just ut_addr_v6[0] */

char __unused[20];            /* Reserved for future use */

};

一个utmp结构体就出来了,大致猜出来可能是/var/log/utmp或者/var/log/wtmp中存放的数据都是这种结构体的数据。那么思路就出来了,读这个文件每次对一个结构体大小的数据。然后输出结果体中想要的成员变量就OK了。那么剩下的就是程序编写的问题了。

3.实践总结

刚看第二章总算还有点信心继续学下去了,不至于像两年前学习C语言那样的迷茫,知道了如果去解决问题在linux下怎么去寻求帮助了。希望通过博客的形式记录自己学习C语言的一些感悟吧。

linux utmp结构体,Linux C编程如何使用联机帮助来解决编程问题?相关推荐

  1. Linux C编程如何使用联机帮助来解决编程问题?

    1.背景 多次学习C语言一直无法踏入C语言的大门,每次都是在学习C语言中的那些系统调用库函数等望而却只,linux下的系统调用需要我们去记忆一些没有规律的结构体和一些大写的宏定义并且还有一个函数多种形 ...

  2. linux sockaddr结构体,linux网络编程笔记 sockaddr_in结构体[转]

    struct sockaddr { unsigned short sa_family; char sa_data[14]; }; 此数据结构用做bind.connect.recvfrom.sendto ...

  3. linux windows 结构体,Linux下C语言——结构体对齐

    结构体对齐的步骤: 1.结构体各成员对齐 2.整个结构体圆整 结构体对齐的特定对齐值: 1.自身对齐值: 自身对齐值就是结构体变量里每个成员的自身大小; 2.指定对齐值: 指定对齐值是由宏#pragm ...

  4. linux tty结构体,linux tty驱动架构分析

    再看Linux tty驱动过程中发现linux的驱动构架中,面向对象的思想已经根深蒂固.就比如这串口驱动,代码中经常有一些貌似和串口无关的代码,比如,tty_register_driver等.但我们却 ...

  5. linux 进程 结构体,Linux中进程控制块PCB-------task_struct结构体结构

    Linux中task_struct用来控制管理进程,结构如下: struct task_struct { //说明了该进程是否可以执行,还是可中断等信息 volatile long state; // ...

  6. linux进程内存结构体,Linux下网络编程(3)——进程间通信(IPC),共享内存,传递结构体数据...

    1. 前言 多进程,总有一些交互要做,不可能各自独立. 这里是最简单的例子.一个写入,一个读取. 一个建立共享内存,写入数据. 一个读取共享内存的内容. 2. 简单例子代码 twriter.cpp 代 ...

  7. linux c 结构体初始化的四种方法

    定义: struct InitMember {int first:double second:char* third:float four; }; 方法一:定义时赋值 struct InitMembe ...

  8. linux网络设备驱动结构体,Linux网络设备驱动之设备驱动的注册与注销(二)

    网络设备驱动的注册与注销由 register_netdev( ) 和 unregister_netdev( ) 函数完成,这两个函数的原型为: int register_netdev(struct n ...

  9. Linux SKB结构体中各个长度字段的含义(len, data_len, headlen, pagelen)

    结构体sk_buff是Linux内核网络子系统的一个基本结构体,关于它的长度有很多定义和操作,非常容易弄混,这里给出一个简单的说明. 下面这幅图是<深入理解Linux网络技术内幕>里面的图 ...

最新文章

  1. GitHub率先消灭了cookies:与烦人的用户条款说再见
  2. python怎么读文件内容-Python读取文件内容为字符串的方法(多种方法详解)
  3. Linux学习笔记03
  4. 只有汇编能告诉你为什么
  5. c语言如何实现玫瑰花
  6. 流程平台:子表控件(二) - 属性、事件、方法
  7. celery-01-异步任务模块-解决发送邮件的延时问题
  8. dataframe 排序_如何对Pandas DataFrame进行自定义排序
  9. 零基础Python完全自学教程:1.认识python
  10. 怎样批量修改照片分辨率?
  11. python 登录新浪微博_模拟登录新浪微博(Python) - 转
  12. 前苏联切尔诺贝利辐射禁区拍摄到野生水獭吞食鱼
  13. RN实现仿余额宝余额数字翻滚动画特效
  14. 仿照Windows的计算器,编写一个简易的计算器程序,实现加、减、乘、除等运算。
  15. 关于PPP拨号的接入点
  16. 转载:深入学习java源码之Callable.call()与Future.get()
  17. oj2783: 编程题A-按要求输入输出
  18. 关于*\jre\lib\rt.jar无法访问的问题
  19. 7-3 重要的话说三遍 (5分)
  20. Jquery-获取子元素children,find

热门文章

  1. Firefox鼠标手势插件在哪安装 火狐浏览器鼠标手势怎么用
  2. win7旗舰版系统电脑没有声音怎么办
  3. http请求POST方式发送获得返回值
  4. Java:File.separator作用相当于 ‘ \ ‘
  5. springboot配置跨mapper.xml的全局变量
  6. Spring框架中的单例Bean是线程安全的吗?
  7. Collections.synchronizedList使用
  8. java内部类为什么使用很少_java内部类有什么好处?为什么需要内部类?
  9. php设计之初用于什么,PHP设计模式(七)之门面模式
  10. 音频服务器未运行怎么办,音频服务未运行怎么办 音频服务未运行解决方法【详细介绍】...