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