2011-12-14 3 views
3

まず、私はC++のコードを書いた:

#include <cstdio> 
int main() 
{ 
    int a,b; 
    while(scanf("%d %d",&a,&b) == 2) 
     printf("%d\n",a+b); 
    return 0; 
} 

を、私はそれをcomplieするg++ -o a a.cppを使用しています。次のように

はその後、私は、Pythonのコードを書いた:

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; 
} 

を私はdata.outに正しい答えを持って、それは、C++のコードで動作EXECVと言うことです。

私はexecvもPythonで動作させるために何をすべきですか?私は本当にこの機能が必要です、誰も私に教えることができますか?どうもありがとう!あなたのpythonのコードで

1 1 

答えて

4

は、あなたが新しいIOストリームを開いて、これらを指すようにsys.stdinsys.stdout Pythonのを設定しました:

data.inは、以下が含まれています。彼らは独自のファイル記述子を持っています(おそらく3と4)。しかし、標準のファイル記述子、0、および1は変更されず、元の場所を引き続き指します。これらは、execをstdinに、stdoutをC++プログラムに継承したときに継承された記述子です。

実行前に実際のファイル記述子が調整されていることを確認する必要があります。

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