Linux C编程如何使用联机帮助来解决编程问题?
2014-07-06 22:45
399 查看
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<utmp.h>
3.紧接着就看看这个头文件中包含了啥
3.实践总结
刚看第二章总算还有点信心继续学下去了,不至于像两年前学习C语言那样的迷茫,知道了如果去解决问题在linux下怎么去寻求帮助了。希望通过博客的形式记录自己学习C语言的一些感悟吧。
多次学习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<utmp.h>
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语言的一些感悟吧。
相关文章推荐
- 如何尽可能高效地使用论坛+解决编程问题的一些方法
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题(非原创,摘自书中)
- 绝对酷,如何解决asp.net中javascript脚本的问题(使用服务器控件执行客户端脚本)
- 如何在 Exchange Server 2003 中使用队列查看器解决邮件流问题
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 如何解决Mysql "发生系统错误2,找不到指定的文件" 的问题(第一次安装使用)
- 如何使用Windows事件查看器和微软知识库解决问题
- 如何解决mid使用过程中出现的以下问题(无效的过程调用或参数: 'mid')
- 如何正确使用事件探察器解决性能问题(http://www.cnblogs.com/tom-fu/archive/2008/06/25/1146934.html#1235440)
- [ChneChen的随笔][管理之道]什么才是我们需要的解决问题的方法(从如何限制公司电脑使用U盘解决之道谈起)
- 如何解决eWebEditor在线编辑器的远程自动上传功能不能使用的问题?
- 绝对酷,如何解决asp.net中javascript脚本的问题(使用服务器控件执行客户端脚本)
- 不同database排序方式,不同语言,如何解决国际化编程问题
- 如何解决烦人的VS.NET2003编译时“无法将程序集复制到文件,另一个程序正在使用,进程无法访问”的问题?
- [翻译]如何解决使用 JMeter 时遇到的问题
- 如何解决eWebEditor在线编辑器的远程自动上传功能不能使用的问题?
- 如何解决在excel工作表中鼠标的右键不能使用的问题
- 如何在 Windows 恢复环境中使用 Bootrec.exe 工具解决和修复 Windows Vista 中的启动问题
- 如何使用 GDI+ 双缓冲 解决绘图闪烁问题