[英]How can I write to a child process stdin obtained with fork() in python?
好吧,我需要寫一個用fork()獲得的子進程的stdin。 我還需要將stdin的文件描述符(?)保留在父進程中,以重復寫入子進程。 我使用os.pipe()
獲取描述符,所以請保持這種方式。
pid = fork()
if pid == 0:
os.write(sys.stdin.fileno(), "sample") # <-- isn't this the child's stdin?
os.execv(..)
.
.
子進程是一個bash腳本,例如:
#!/bin/bash
/usr/bin/mplayer -slave "$1" <&0
顯然,我想用它來控制與蟒mplayer的slave
從其標准輸入接收命令模式
由於程序的結構,fork()是必不可少的,因此請不要使用communicate
等替代方法
您試圖做的事是不可能的,因為那沒有道理。 子級與父級具有相同的stdin,而不是可以寫入的新stdin。 POSIX保證在fork
之后:
子進程應具有其父文件描述符的自己的副本。 每個子文件描述符都應使用父文件的相應文件描述符引用相同的打開文件描述。
同時,您正在嘗試從孩子內部寫入孩子的stdin。 這更沒有意義了。 您期望寫自己的stdin做什么?
當然,孩子可以寫自己的標准輸出,這與父母的標准輸出相同。 但是我懷疑那不是您想要的。 您想要的是讓父母寫給孩子的stdin。
如果是這樣,則必須在派生之前創建一個管道,然后將子級的stdin替換為該管道的讀取側(通常使用dup2
),然后寫入該管道的寫入側。 CPython subprocess
實現是出色的示例代碼,它說明了如何在不依賴高級功能的情況下執行此操作(即使它是C語言而不是Python語言)。
像這樣:
pr, pw = pipe()
pid = fork()
if pid == 0:
os.close(pw)
sys.stdin.close()
os.dup2(pr, 0)
os.execv(...)
else:
os.close(pr)
os.write(pw, "sample")
為了完整起見,這是托馬斯·奧羅斯科 ( Thomas Orozco)提供的另一個可行示例的答案: https : //stackoverflow.com/a/12309286/491827
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.