• 【Educoder作业】操作系统之进程管理(一)


    【Educoder作业】操作系统之进程管理(一)

    这鬼实训全是坑

    T1 显示进程信息

    这个题本意是教我们一些进程的基本操作,但是由于描述的实在太烂了导致我们会遇到各种各样的问题。
    首先,如果我们的进程信息用 l i s t list list a p p e n d append append,也就是列表来搞的话,会遇到一个很奇怪的问题:
    T y p e E r r o r : u n h a s h a b l e t y p e : ′ l i s t ′ TypeError: unhashable type: 'list' TypeError:unhashabletype:list
    这是因为,他的判断程序的逻辑是,把我们生成的进程集进行哈希比较,如果我们进程集里面的进程用的还是列表,列表是不能哈希的,所以会报错。
    也就是说我们需要用元组的方式把他存起来,元组是可哈希的。

    import psutil
    
    def get_proc_by_name(pname):
        procs = []
        for proc in psutil.process_iter():
            try:
                # 请在此添加代码,补全函数get_proc_by_name
                #-----------Begin----------
                # proc是一个进程
                if pname in proc.name() :
                    procs.append(proc)
                #------------End-----------
            except psutil.AccessDenied:
                pass
            except psutil.NoSuchProcess:
                pass
        return procs
        
    def get_procs_info(procs):
        procsinfo = []
        f = open('myresult.txt','w')
        for p in procs:
            procinfo = []
            with p.oneshot():
                f.write(str(p.pid)+'\n')
                # 请在此添加代码,补全函数get_procs_info
                #-----------Begin----------
                #需要将相关信息写入到文件myresult.txt当中,使用write(),注意要将进程信息转化成字符串才能输入到文件中,使用str()转化
                procinfo = (p.pid, p.name(), p.cpu_times(), p.exe(), p.status(), p.cwd())
                #------------End-----------
            procsinfo.append(procinfo)
        f.close()
        return procsinfo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    T2 创建展示某个进程的信息

    这个就更扯了,他的答案是固定的。
    意思就是说,在实际情况将,每一个进程虽然是用同样的方式运行同样的程序,但是由于 c p u cpu cpu啥的各种原因,其余所有信息都不变但是 i d id id这个是会变得。这个实训就不变…,这是第一个坑。
    第二个坑,由于上面的问题,检测程序的逻辑是,先运行我们的程序,然后运行一个标答,标答是检测你有没有运行题目里要求的进程,同时返回一个进程。问题来了,如果我们在自己的程序里把进程终止了,比如你写了 p r o c . t e r m i n a t e ( ) proc.terminate() proc.terminate(),那就完了。因为标答是检测我们是否运行了指定程序,而我们关闭了之后他就检测不到了…
    多的不讲,看代码吧,我花 3000 3000 3000金币买的

    from subprocess import Popen
    from psutil import *
    
    def creatProcess():
        # 请在此添加代码,补全函数creatProcess
        #-----------Begin----------
        popen = Popen(['python', 'test.py'])
        proc = Process(popen.pid)
        with proc.oneshot() :
            procinfo = (proc.pid, proc.name(), proc.exe(), proc.cwd())
        #------------End-----------
        return procinfo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    T3 启动并终止进程

    这个题就更更扯了。他在主函数里写的是 w h i l e while while????,也就是说最后无论如何都是成功。我们直接 p r i n e ( ′ 成 功 ′ ) prine('成功') prine()即可。
    正常做法就是第二题的整合,看一眼第二题的标答程序就理解 c m d l i n e cmdline cmdline的用法了。
    顺便说一下代码里的 f o r . . e l s e for..else for..else结构。这个是 P y t h o n Python Python独有的,他的意义是如果 f o r for for是完整循环下来的,就运行 e l s e else else。比如这个题里,如果能完整循环下来就只可能是不断 p a s s pass pass下来,也就是没有我们要的进程,那就会进到 e l s e else else里。

    import psutil
    from subprocess import Popen
    
    def startOrkillProc():
        for process in psutil.process_iter():
            try:
                # 请在此添加代码,补全函数startOrkillProc
                #-----------Begin----------
                if process.cmdline() == ['python', 'test.py'] :
                    process.terminate()
    
                #------------End-----------
                    return 'Process found. Terminating it.'
            except:
                pass
        else:
            # 请在此添加代码,补全函数startOrkillProc
            #-----------Begin----------
            proc = psutil.Process(Popen(['python', 'test.py']).pid)
    
            #------------End-----------
            return 'Process not found: starting it.'
    
    if __name__=="__main__":
        OK = False
        while True:
            if startOrkillProc()=="Process found. Terminating it.":
                OK = True
                print("成功")
                break
        if not OK:
            print('失败')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    通过SpringBoot+Vue+ElementUI+EasyExcel实现文件的导入导出
    Redis之淘汰策略
    手机打开 第三方 “微信、快手、QQ、电话、信息” 等
    【语音识别】基于动态时间规整算法(DTW)实现中文语音识别系统含Matlab源码
    03路由策略
    element 表格fixed列高度无法100%
    测试用例设计方法六脉神剑——第四剑:石破天惊,功能图法攻阵
    (位运算) 剑指 Offer 15. 二进制中1的个数 ——【Leetcode每日一题】
    Excel基于分隔符拆分列
    软件架构设计 C/S与B/S架构的区别
  • 原文地址:https://blog.csdn.net/JZYshuraK/article/details/125402599