2016-05-17 9 views
2

に行った後に実行された私のコードの一部です:STDシステムは、ここで次の行のC++

void Espresso::run() 
{ 
    std::system("/home/espresso-ab-1.0/src/espresso espresso.in > espresso.out"); 
    std::string line; 
    std::ifstream myfile ("espresso.out"); 
    if (myfile.is_open()) 
    { 
    while (getline (myfile,line)) 
    { 
     std::cout << line << '\n'; 
    } 
    myfile.close(); 
    } 
} 

上記のコードは最初のシステムコマンドを実行して、完全に「espresso.out」ファイルを記入してから行く場合、私は疑問に思ってそれを次の行に読んでください。 もしそうでなければ、ファイルを読む前に完全に印刷されていることを確認する方法を教えてください。

注:私はC++ 03を使用するように制限されています。

すぐにお返事ありがとうございます。私の質問を更新したい: - スレッドセーフな方法ですか?

+2

'std :: system'はコマンドが終了するまでブロックします。そうすれば' espresso.out'ファイルはあなたがそれを開こうとする時までに「準備完了」になります。 – szczurcio

+1

['popen'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/popen.html)を使用して、代わりにコマンドの出力を直接読むことができます。しかし、あなたはC 'FILE *' "ストリーム"を使う必要があります。 –

+1

@szczurcio:質問に答えるには_commentsセクション_ではなく_answerセクション_を使用してください。 –

答えて

2

はい、このコマンドは、std::systemコールが返される前に完全に完了します。

2

は非同期関数ではありません。たとえば、次のように実行するとします。

std::system("sleep 5"); 
std::cout << "Foo" << std::endl; 

「Foo」が5秒後に表示されます。 もちろんLinuxの場合は、std::system("sleep 5 &")のように実行できます。 sleepコマンドはバックグラウンドプロセスとして実行され、システムコールに続くコードは直ちに実行されます。 この機能を使用しないことをお勧めしますが、システム関数を名前で呼び出すのは危険です。自分のシステムでスリープバイナリを自分のプログラムに置き換えた場合、どうなるか想像してみてください。結論:あなたのプログラムはシステムコマンドが完了するまでハングします。あなたのファイルは準備ができています。

関連する問題