【Educoder作业】操作系统之进程管理(一)
这鬼实训全是坑
T1 显示进程信息
这个题本意是教我们一些进程的基本操作,但是由于描述的实在太烂了导致我们会遇到各种各样的问题。
首先,如果我们的进程信息用l i s t listlist和a 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('失败')