2016-10-09 16 views
0

一般に、私は.cと.pyプログラムによって読み書きされる2つのFIFOを作成しています。私の.cプログラムがPythonと対話できるようにするために、私は<python2.7/Python.h>ライブラリを含んでいます。CとPython間のFifoファイルの読み込みと書き込み

まず、私の.cプログラムは、CFifoというファイルを作成し、fprintfを使用してそのファイルにテキストを書き込みます。問題はない。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <python2.7/Python.h> 


int main() { 
    FILE *CFifo, *pythonFifo, *pythonFile; 
    char buffer[1024]; 

    // declare python 
    Py_SetProgramName("writer.py"); 

    // init python 
    Py_Initialize(); 

    // open python 
    pythonFile = fopen("writer.py", "r"); 

    // C writes to file, python reads from this file 
    CFifo = fopen("./CFifo", "w"); 

    // Print strings to file using fprintf 
    fprintf(CFifo, "This is a test"); 

    // close file python reads 
    fclose(CFifo); 

私のCプログラムの2番目の部分は、私のPythonプログラムで(第2のFIFOキューに)書かれた情報を読み取る必要がありますが./pythonFifoを開いたときに代わりにそれだけの端末でハングアップします。

これはfifoキューへの書き込みを担当するpythonセクションです。

# open fifo file that python writes to 
filename_write = "./pythonFifo" 
pipe = os.open(filename_write, os.O_WRONLY) 
for output in finalStringList: 
    os.write(pipe, output) 
os.close(pipe) 

2番目のファイルの目的は、最初のファイルから読み取った変更情報を書き込むことです。

答えて

1

ここからはアクセスできません。 mkfifo manページから...あなたは、このようにFIFOの特殊ファイルを作成したら

、通常の ファイルと同様に、読み取りまたは書き込みのためにそれを開くことができます 任意のプロセス。ただし、両方の端が同時に開いていなければ、入力または出力操作を進めることができます。 FIFOを開くと、通常のブロックは、他のプロセスが同じFIFOを書き込み用に開くまでブロックされ、その逆もあります。

ファイルを開く前にファイルを開く必要があります。しかしPyRun_SimpleFileはpythonスクリプトをsychronously実行するので、ファイルを開く後者のCコードには決して到達しません。最初にCコードで開こうとすると、Pythonコードを実行する前にハングすることになります。古典的なデッドロックがあります。

別のコンソールにcat pythonFifoecho foo > pythonFifoのようにいくつかのプリントをサンプルに追加して、プログラムの進行状況を確認できました。それはもちろんゴミを返すが、問題を証明した。

実は、あなたはここからそこに着くことができます(再び、manページ)

参照FIFO(7)FIFO特殊ファイルの取り扱いをノンブロッキングため。

しかし、あなたのpythonコードがパイプに収まる以上にデッドロックするように自分自身を開きます。あなたは、あなたのPythonプログラムをいくつかの変数に書き込んで、あなたのCコードにそこから読み込ませる方が良いかもしれません。

+0

Pythonプログラムを非同期で実行するように勧めますか?このデッドロックを解決する "自然な"方法ではないでしょうか? – Alfe

+0

@Alfe - これは素晴らしい方法ですが、もっと自然な方法がわかりません。それは私たちが知らない他の設計上の問題に依存します。 – tdelaney

+0

私はこの 'PyRun_SimpleFile'が新しいプロセスを開始してPythonの処理を開始し、子プロセスの終了を明示的に待機すると仮定しました。私たちがすべてプロセスを並行して実行するオペレーティングシステムを使用しているため、「自然」な方が待ち時間がかかりません。あなたの反応は私を疎外しました。 'PyRun_SimpleFile'は現在のプロセス内でそのタスクを実行していますか?その後、FIFOを使用することはおそらく一般的に間違った選択になるでしょう。 – Alfe

関連する問題