는()

2011-12-14 2 views
3

첫째, 나는 C++ 코드를 썼다. 는()

import os,sys 
sys.stdin = open("./data.in","r") 
sys.stdout = open("./data.out","w") 
pid = os.fork() 
if pid == 0: 
    cmd = ["./a","./a"] 
    os.execv(cmd[0],cmd) 

는 그러나, data.out 파일이 아무것도 포함하지 않는 다음과 같이

그 후, 나는 파이썬 코드를 썼다. 즉, 자식 프로세스는 부모 프로세스에서 stdin 및 stdout을 상속받지 않았습니다. 나는 C++ 코드를 작성하지만 다음과 같이

#include<unistd.h> 
#include<cstdio> 
int main() 
{ 
    freopen("data.in","r",stdin);a 
    freopen("data.out","w",stdout); 
    int pid = fork(); 
    if(pid == 0) 
    { 
     char* cmd[]= {"./a","./a"}; 
     execv(cmd[0],cmd); 
    } 
    return 0; 
} 

나는 그는 C++ 코드에서 작동 execv와 말을하는 것입니다의 data.out에 올바른 대답을 얻었다.

그래서 execv가 파이썬에서도 작동하도록하려면 어떻게해야합니까? 이 기능이 정말로 필요합니다. 아무도 말해 줄 수 있습니까? 고마워요! 파이썬 코드에서

1 1 

답변

4

, 당신은 새로운 IO 스트림을 열고 다음을 가리 키도록 sys.stdinsys.stdout 파이썬 이름을 설정 한 :

data.in에는 다음이 포함되어 있습니다. 그들은 자신의 파일 기술자 (대부분 3, 4)를 가질 것입니다. 그러나 표준 파일 설명자인 01은 변경되지 않고 원래 위치를 계속 가리 킵니다. 이것들은 exec을 stdin으로, stdout을 C++ 프로그램에서 상속 한 디스크립터입니다.

실행하기 전에 실제 파일 설명자를 조정해야합니다.

os.dup2(sys.stdin.fileno(), 0) 
os.dup2(sys.stdout.fileno(), 1)