Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果我在子进程中接受一些输入,fork和exec组合将不起作用_Python_Io_Terminal_Fork - Fatal编程技术网

Python 如果我在子进程中接受一些输入,fork和exec组合将不起作用

Python 如果我在子进程中接受一些输入,fork和exec组合将不起作用,python,io,terminal,fork,Python,Io,Terminal,Fork,我编写了一个python代码,其中一个进程使用fork()创建另一个进程。在子进程中,我想使用execlp()打开另一个进程 我在子进程中打开的程序显示EOF错误。我不明白为什么,因为当我尝试单独运行该子程序时,它不会显示任何错误 对于主进程,Python代码是 import os def main(): pid=os.fork() if pid==0: os.execlp("python3", "python3",

我编写了一个python代码,其中一个进程使用
fork()
创建另一个进程。在子进程中,我想使用
execlp()
打开另一个进程

我在子进程中打开的程序显示EOF错误。我不明白为什么,因为当我尝试单独运行该子程序时,它不会显示任何错误

对于主进程,Python代码是

import os  
def main():  
        pid=os.fork()  
        if pid==0:  
                os.execlp("python3", "python3", "child1.py")  
        else:  
                print("I am parent")  
main() 
对于子进程,代码是

def main():  
  a=input("enter a no : ")  
  print("I am child "+str(a))  
main() 
当我打开主程序或父进程时得到的输出是

I am parent
debesh@laptop:~/Documents/programs/python/parallel_processes$ enter a no : Traceback (most recent call last):
  File "child1.py", line 5, in <module>
    main()
  File "child1.py", line 2, in main
    a=input("enter a no : ")
EOFError
我是家长
debesh@laptop:~/Documents/programs/python/parallel\u processs$输入一个no:Traceback(最后一次调用):
文件“child1.py”,第5行,在
main()
文件“child1.py”,第2行,在main中
a=输入(“输入编号:”)
伊奥费罗

在其父代死亡后,子代正试图从终端读取数据。这不起作用,因为子进程不再位于前台进程组中

好的,什么是前台进程组?其基本思想是,将同一个shell作业中的一组进程组合起来。从终端中的shell运行程序时,shell将为该程序创建一个进程组。如果程序分叉,则子进程属于同一进程组。如果您在后台运行程序(
myprogram&
),则进程组为;如果在前台运行程序(没有
&
),则进程组为(只能有一个前台进程组)。shell命令
fg
bg
可以将进程组带到前台或后台。进程组用于两件事:您可以同时向它们发送信号,它们决定允许谁访问终端

只允许前台进程组从终端读取。如果后台进程试图从终端读取,系统调用将返回
EIO
。这是一个用户界面设计决策:当用户在前台与程序交互时,后台进程不会破坏这一点

让我们检测子进程以打印有关其进程组的信息:

#!/usr/bin/python3
import os
def main():  
  print("Child: pid={pid:d} ppid={ppid:d} pgid={pgid:d}".format(pid=os.getpid(), ppid=os.getppid(), pgid=os.getpgrp()))
  a=input("enter a no : ")  
  print("I am child "+str(a))  
main() 
样本输出:

$ ./parent.py 
I am parent
$ Child: pid=15593 ppid=1 pgid=15592
enter a no : Traceback (most recent call last):
  File "child1.py", line 7, in <module>
    main() 
  File "child1.py", line 5, in main
    a=input("enter a no : ")  
EOFError
这一次,子进程仍在前台进程组中,因此它可以按预期访问终端


我不知道为什么Python将错误报告为
eoferor
,而不是
IOError

在其父代死亡后,子代正试图从终端读取数据。这不起作用,因为子进程不再位于前台进程组中

好的,什么是前台进程组?其基本思想是,将同一个shell作业中的一组进程组合起来。从终端中的shell运行程序时,shell将为该程序创建一个进程组。如果程序分叉,则子进程属于同一进程组。如果您在后台运行程序(
myprogram&
),则进程组为;如果在前台运行程序(没有
&
),则进程组为(只能有一个前台进程组)。shell命令
fg
bg
可以将进程组带到前台或后台。进程组用于两件事:您可以同时向它们发送信号,它们决定允许谁访问终端

只允许前台进程组从终端读取。如果后台进程试图从终端读取,系统调用将返回
EIO
。这是一个用户界面设计决策:当用户在前台与程序交互时,后台进程不会破坏这一点

让我们检测子进程以打印有关其进程组的信息:

#!/usr/bin/python3
import os
def main():  
  print("Child: pid={pid:d} ppid={ppid:d} pgid={pgid:d}".format(pid=os.getpid(), ppid=os.getppid(), pgid=os.getpgrp()))
  a=input("enter a no : ")  
  print("I am child "+str(a))  
main() 
样本输出:

$ ./parent.py 
I am parent
$ Child: pid=15593 ppid=1 pgid=15592
enter a no : Traceback (most recent call last):
  File "child1.py", line 7, in <module>
    main() 
  File "child1.py", line 5, in main
    a=input("enter a no : ")  
EOFError
这一次,子进程仍在前台进程组中,因此它可以按预期访问终端


我不知道为什么Python会将错误报告为
eoferor
,而不是
IOError

可能是@smcatepillar的重复,该线程无法解释发生了什么,并且OP声明他正在Windows上工作,所以不,它不是重复的。可能是@smcatepillar的重复。该线程没有解释发生了什么,并且那里的OP声明他正在Windows上工作,所以不,它不是重复的。