问题描述
我有一个任务,我们在为Linux OS制作外壳。而且我有很多问题!
我被允许使用 os 库中的某些方法在python中执行此操作。这个想法是我的程序应该直接与linux操作系统调用通信。
所以这包括:
- 创建
- 打开
- 关闭
- 阅读
- 写
- 退出
- 管道
- 执行
- 叉
- Dup2
- 等待
到目前为止,我制作了一个可以使用 execvp 执行命令的外壳程序,但是我在管道方面遇到了麻烦。
I was reading this q/a and i felt that I almost understood what i have to do
我想我必须使用 Dup2 来写(也许以后再读)。另外,如果我在有关管道的某些时候应该使用read()和write(),我也有些困惑。
from os import (
execvp,wait,fork,close,pipe,dup2,)
from os import _exit as kill
STDIN = 0
STDOUT = 1
STDERR = 2
CHILD = 0
def piping(cmd):
reading,writing = pipe()
pid = fork()
if pid > CHILD:
wait()
close(writing)
dup2(reading,STDIN)
execvp(cmd[1][0],cmd[1])
kill(127)
elif pid == CHILD:
close(reading)
dup2(writing,STDOUT)
execvp(cmd[0][0],cmd[0])
kill(127)
else:
print('Command not found:',cmd)
piping([['ls','-l','/'],['grep','var']])
如果我运行此代码,它将起作用。但我有些不明白:
- execvp如何知道它从管道中获取了额外的参数?
- 我到底为什么要杀人,为什么要杀死127?
- 如何在父级内部运行execvp?在C语言中也可以吗?
- 如果我有一个嵌套管道,例如:
ls -l / | grep var | xclip -selection clipboard
,那么我应该创建一个新的fork吗? (也许有些递归)
写文件不是分配的一部分,但是稍后我可以使管道工作时也可以实现它。
- 我也应该使用dup2还是可以读/写
提前谢谢! :)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)