hello.py
#!/usr/bin/python
import sys
print "Hello!"
Readin = sys.stdin.read()
print Readin
< > C++代码来自堆栈溢出的另一个问题。它应该如何工作:创建一对管道。
使用fork()
创建子进程。
孩子正在将管道弯曲到stdin/stdout。关闭另一端 开始写剧本。
父亲正在监听管道read()
,接收输入。之后,
正在发送消息write()
。
当输入switch (readResult = read(childToPa...
时,程序不会从父亲行返回。在
我也不知道这个写作部分是否在发挥作用。这样做是一个很有前途的想法,还是有其他可行的方法? 谢谢!在
它看起来像:
^{pr2}$
您的问题是缓冲输出、未关闭的文件描述符以及使用EOF来发出传输的部分结束的信号。前两个问题可以解决,但最后一个问题需要不同的方法。稍后再谈。在
循序渐进:
Python正在使用缓冲I/O,因此您可能希望通过在第一个print语句之后添加一行
sys.stdout.flush()
来强制Python刷新输出。现在"Hello!\n"
被逐字读取。在但是下一个
read
将阻塞,直到新字符到达或管道关闭。Python脚本的STDUT仍然是打开的,C++程序正在等待某些东西到达,但是Python脚本本身也在等待一些输入。典型的死锁。在您可以放弃python脚本中的最后一次打印,并尝试关闭其STDOUT。由于}。在
read
将一直阻塞,直到引用管道写入端的所有文件描述符都关闭,因此必须在flush
之后添加os.close(sys.stdout.fileno())
和{但仍有有效的文件描述符引用该管道的写入部分。还记得C++源中的^ {CD8}}吗?在这三行}引用脚本STDIN和STDOUT。所以我们必须关闭它们。在
dup2
之后,仍然有parentToChild[READ_FD]
和{dup2
后面添加close(parentToChild[READ_FD]);
和close(childToParent[WRITE_FD]);
。现在,read
在Python脚本关闭STDOUT和STDERR时返回0
。在接下来,父进程发送
"{\"AElement\":\"Something\"}\0"
,并到达waitpid
,当子进程退出时返回。但孩子还在读STDIN的书。所以你必须在waitpid
之前加上close(parentToChild[WRITE_FD]);
。在现在是概念部分:您不能
read()
,直到它返回一个0
(pipeclosed),然后继续从这个封闭的管道中读取。您的选择:顺便说一句:}(!)开头以空指针结束。请将该行改为
execlp
的参数是const char *file, const char *arg, ...
,其中arg, ...
是通常的char *args[]
,以{int retexe = execlp(target, target, (char*) NULL);
^{pr2}$
相关问题 更多 >
编程相关推荐