iotop源码分析一

#iotop是一个python编写的命令行下图形展示磁盘占用率的工具,学习python,看看他的源码,记录一下

#主程序文件 iotop

#__future__ 可调用新版本的一些模块使用
from __future__ import print_function
#导入系统模块
import sys

#try..except..else用法
#try..except语句来处理异常。我们把通常的语句放在try-块中,而把我们的错误处理语句放在except-块中,执行完try后,执行else中的try语句。
try:
        #导入了main函数
    from iotop.ui import main
except ImportError as e:
    print(e)
    print(‘To run an uninstalled copy of iotop,‘)
    print(‘launch iotop.py in the top directory‘)
else:
    try:
    #执行main函数
        main()
    except KeyboardInterrupt:
        pass
    sys.exit(0)
    
#分析ui模块里的main,如下
#定义了用法的变量

USAGE = ‘‘‘%s [OPTIONS]

DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling
period. SWAPIN and IO are the percentages of time the thread spent respectively
while swapping in and waiting on I/O more generally. PRIO is the I/O priority at
which the thread is running (set using the ionice command).

Controls: left and right arrows to change the sorting column, r to invert the
sorting order, o to toggle the --only option, p to toggle the --processes
option, a to toggle the --accumulated option, i to change I/O priority, q to
quit, any other key to force a refresh.‘‘‘ % sys.argv[0]

#main函数
def main():
    try:
            #设置语系
        locale.setlocale(locale.LC_ALL, ‘‘)
    except locale.Error:
        print(‘unable to set locale, falling back to the default locale‘)
    #optparse 命令行模块
    #action的方法有store_true append 
    #add_option添加命令行参数
    parser = optparse.OptionParser(usage=USAGE, version=‘iotop ‘ + VERSION)
    parser.add_option(‘-o‘, ‘--only‘, action=‘store_true‘,
                      dest=‘only‘, default=False,
                      help=‘only show processes or threads actually doing I/O‘)
    parser.add_option(‘-b‘, ‘--batch‘, action=‘store_true‘, dest=‘batch‘,
                      help=‘non-interactive mode‘)
    parser.add_option(‘-n‘, ‘--iter‘, type=‘int‘, dest=‘iterations‘,
                      metavar=‘NUM‘,
                      help=‘number of iterations before ending [infinite]‘)
    parser.add_option(‘-d‘, ‘--delay‘, type=‘float‘, dest=‘delay_seconds‘,
                      help=‘delay between iterations [1 second]‘,
                      metavar=‘SEC‘, default=1)
    parser.add_option(‘-p‘, ‘--pid‘, type=‘int‘, dest=‘pids‘, action=‘append‘,
                      help=‘processes/threads to monitor [all]‘, metavar=‘PID‘)
    parser.add_option(‘-u‘, ‘--user‘, type=‘str‘, dest=‘users‘, action=‘append‘,
                      help=‘users to monitor [all]‘, metavar=‘USER‘)
    parser.add_option(‘-P‘, ‘--processes‘, action=‘store_true‘,
                      dest=‘processes‘, default=False,
                      help=‘only show processes, not all threads‘)
    parser.add_option(‘-a‘, ‘--accumulated‘, action=‘store_true‘,
                      dest=‘accumulated‘, default=False,
                      help=‘show accumulated I/O instead of bandwidth‘)
    parser.add_option(‘-k‘, ‘--kilobytes‘, action=‘store_true‘,
                      dest=‘kilobytes‘, default=False,
                      help=‘use kilobytes instead of a human friendly unit‘)
    parser.add_option(‘-t‘, ‘--time‘, action=‘store_true‘, dest=‘time‘,
                      help=‘add a timestamp on each line (implies --batch)‘)
    parser.add_option(‘-q‘, ‘--quiet‘, action=‘count‘, dest=‘quiet‘, default=0,
                      help=‘suppress some lines of header (implies --batch)‘)
    parser.add_option(‘--profile‘, action=‘store_true‘, dest=‘profile‘,
                      default=False, help=optparse.SUPPRESS_HELP)
                    
                    
        #调用 parse_args() 来解析程序的命令行
    options, args = parser.parse_args()
    if args:
        parser.error(‘Unexpected arguments: ‘ + ‘ ‘.join(args))
     
    #find_uids,判断用户的UID函数
    find_uids(options)
    ####################################################################
    #根据获得用户的值,获取UID

    def find_uids(options):
    """Build options.uids from options.users by resolving usernames to UIDs"""
    #定义一个序列
    options.uids = []
    error = False
    for u in options.users or []:
        try:
            uid = int(u)
        except ValueError:
            try:
                #
                passwd = pwd.getpwnam(u)
            except KeyError:
                print(‘Unknown user:‘, u, file=sys.stderr)
                error = True
            else:
                uid = passwd.pw_uid
        if not error:
            #把uid加入到序列里
            options.uids.append(uid)
    if error:
        sys.exit(1)    
    ####################################################################
    options.pids = options.pids or []
    options.batch = options.batch or options.time or options.quiet

    main_loop = lambda: run_iotop(options)

    if options.profile:
        def safe_main_loop():
            try:
                main_loop()
            except:
                pass
        _profile(safe_main_loop)
    else:
        main_loop()
时间: 2024-10-23 04:45:21

iotop源码分析一的相关文章

iotop源码分析二

import ctypes import fnmatch import os import platform import time IOPRIO_GET_ARCH_SYSCALL = [     ('alpha',       '*',  443),     ('i*86',        '*',  290),     ('ia64*',       '*', 1275),     ('ppc*',        '*',  274),     ('s390*',       '*',  2

TeamTalk源码分析之login_server

login_server是TeamTalk的登录服务器,负责分配一个负载较小的MsgServer给客户端使用,按照新版TeamTalk完整部署教程来配置的话,login_server的服务端口就是8080,客户端登录服务器地址配置如下(这里是win版本客户端): 1.login_server启动流程 login_server的启动是从login_server.cpp中的main函数开始的,login_server.cpp所在工程路径为server\src\login_server.下表是logi

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

HashMap与TreeMap源码分析

1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Java这么久,也写过一些小项目,也使用过TreeMap无数次,但到现在才明白它的实现原理).因此本着"不要重复造轮子"的思想,就用这篇博客来记录分析TreeMap源码的过程,也顺便瞅一瞅HashMap. 2. 继承结构 (1) 继承结构 下面是HashMap与TreeMap的继承结构: pu

Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938395.html 前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化.在内核初始化函数start_kernel执行到最后,就是调用rest_init函数,这个函数的主要使命就是创建并启动内核线

Spark的Master和Worker集群启动的源码分析

基于spark1.3.1的源码进行分析 spark master启动源码分析 1.在start-master.sh调用master的main方法,main方法调用 def main(argStrings: Array[String]) { SignalLogger.register(log) val conf = new SparkConf val args = new MasterArguments(argStrings, conf) val (actorSystem, _, _, _) =

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三)

Solr4.8.0源码分析(22)之 SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及PeerSync策略.本文以及后续的文章将重点介绍Replication策略.Replication策略不但可以在SolrCloud中起到leader到replica的数据同步,也可以在用多个单独的Solr来实现主从同步.本文先介绍在SolrCloud的leader到replica的数据同步,下一篇

zg手册 之 python2.7.7源码分析(4)-- pyc字节码文件

什么是字节码 python解释器在执行python脚本文件时,对文件中的python源代码进行编译,编译的结果就是byte code(字节码) python虚拟机执行编译好的字节码,完成程序的运行 python会为导入的模块创建字节码文件 字节码文件的创建过程 当a.py依赖b.py时,如在a.py中import b python先检查是否有b.pyc文件(字节码文件),如果有,并且修改时间比b.py晚,就直接调用b.pyc 否则编译b.py生成b.pyc,然后加载新生成的字节码文件 字节码对象

LevelDB源码分析--Iterator

我们先来参考来至使用Iterator简化代码2-TwoLevelIterator的例子,略微修改希望能帮助更加容易立即,如果有不理解请各位看客阅读原文. 下面我们再来看一个例子,我们为一个书店写程序,书店里有许多书Book,每个书架(BookShelf)上有多本书. 类结构如下所示 class Book { private: string book_name_; }; class Shelf { private: vector<Book> books_; }; 如何遍历书架上所有的书呢?一种实