python - 尝试使用 fork、exec 和 pid wait 在 Python 中编写 Unix 类型的 shell
问题描述
我正在尝试使用fork
,exec
和. 在 Python 中编写一个 Unix 类型的 shell waitpid
。到目前为止,我有这个代码:
while True:
pid = os.fork()
command = os.getcwd() + ">"
x = input(command)
split_string = x.split(" ")
if pid == 0:
os.execvp(split_string[0], split_string)
else:
finish = os.waitpid(0, 0)
print(finish)
但是,当我从 Unix shell 使用它时,它什么也没做。
解决方案
请注意,您的提示(您将其命名为command
)被打印了两次。这是因为子进程在等待输入命令时卡在自己的提示符中。如果您按Enter一次,然后键入您的命令(例如ls
) ,然后再按一次,Enter您的程序就可以工作了。
一个简单的解决方法是os.fork()
在提示之后调用:
import os
while True:
command = os.getcwd() + ">"
x = input(command)
split_string = x.split(" ")
pid = os.fork()
if pid == 0:
os.execvp(split_string[0], split_string)
else:
finish = os.waitpid(0, 0)
print(finish)
推荐阅读
- sql - 具有不同日期范围的行到列
- jupyter-notebook - jupyter 不会在默认目录之外运行代码
- ag-grid - 如何在服务器端/无限行模型中使用快速过滤器?
- python - 如何以 20 秒的间隔迭代音频文件?
- javascript - 检测 html 页面何时在对象标签中完成加载
- sql - SQL Server - 需要将日期范围“透视”到单独的记录中
- angular - 如何完成一个 Observable 的 Observable
- google-cloud-platform - 在哪里查找 Google Cloud Speech 中的错误代码?
- c++11 - 构建器模式 - Build() 方法的可重用性
- c# - 如何创建一个新的 DataGridViewRow 并使用列名而不是索引指定值?