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

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

这鬼实训全是坑

T1 显示进程信息

这个题本意是教我们一些进程的基本操作,但是由于描述的实在太烂了导致我们会遇到各种各样的问题。
首先,如果我们的进程信息用l i s t listlista p p e n d appendappend,也就是列表来搞的话,会遇到一个很奇怪的问题:
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

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

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

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

T3 启动并终止进程

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

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('失败')

版权声明:本文为JZYshuraK原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。