2016-10-09 3 views
0

Im Allgemeinen erstelle ich zwei FIFO-Warteschlangen, die von meinen .c- und .py-Programmen gelesen und beschrieben werden können. Um zu ermöglichen, dass mein .c-Programm mit Python interagiert, habe ich die <python2.7/Python.h>-Bibliothek aufgenommen.Lesen und Schreiben von Fifo-Dateien zwischen C und Python

Erstens erstellt mein .c-Programm eine Datei namens CFifo und schreibt Text mit fprintf. Kein Problem dort.

#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); 

Der zweite Teil meines C-Programm soll es hängt die Information geschrieben (in der zweiten FIFO-Warteschlange) durch meinen Python Programm, sondern stattdessen nur in dem Endgerät lesen, wenn ./pythonFifo öffnen.

// make second fifo queue 
    // python writes to this file, C reads from it 
    mkfifo("./pythonFifo", 0777); 

    // run python program 
    PyRun_SimpleFile(pythonFile, "writer.py"); 
    pythonFifo = fopen("./pythonFifo", "r"); 

    while(fgets (buffer, sizeof(buffer), pythonFifo)) { 
     printf("%s", buffer); 
    } 

    // close python 
    Py_Finalize(); 
    fclose(pythonFifo); 
    remove("./pythonFifo"); 

    return 0; 
} 

Dies ist verantwortlich Python Abschnitt zu der FIFO-Warteschlange für das Schreiben.

Der Zweck der zweiten Datei besteht darin, geänderte Informationen aus der ersten Datei zu schreiben.

Antwort

1

Sie können nicht von hier kommen. Vom mkfifo Manpage ...

Sobald Sie eine FIFO spezielle Datei auf diese Weise erstellt haben, jeder Prozess es zum Lesen oder Schreiben, auf die gleiche Art und Weise wie eine gewöhnliche Datei öffnen kann. Es muss jedoch an beiden Enden gleichzeitig geöffnet sein, bevor Sie mit Eingaben oder Ausgaben vornehmen können. Öffnen eines FIFO zum Lesen von normalen Blöcken, bis ein anderer Prozess den gleichen FIFO zum Schreiben öffnet und umgekehrt.

Beide Seiten müssen die Datei öffnen, bevor sie fortfahren können. Aber da PyRun_SimpleFile ein Python-Skript synchron ausführt, wird der letzte C-Code, der die Datei öffnet, nie erreicht. Wenn Sie versuchen, es zuerst im C-Code zu öffnen, würde es vor dem Ausführen des Python-Codes hängen bleiben. Sie haben einen klassischen Deadlock.

Ich habe mehrere Prints zu Ihrer Probe hinzugefügt und konnte das Programm sehen wie ich cat pythonFifo und echo foo > pythonFifo in einer separaten Konsole sah. Es gab Müll natürlich zurück, aber das Problem wurde bewiesen.

Eigentlich kann man es von hier (wieder, die man-Seite)

See Fifo (7) für den Umgang mit FIFO speziellen Dateien nicht blockierend.

aber Sie öffnen sich für mehr Deadlocking, wenn Ihr Python-Code mehr als passt in die Pipe schreibt. Vielleicht ist es besser, wenn Ihr Python-Programm auf eine Variable schreibt und Sie Ihren C-Code von dort lesen lassen.

+0

Wie wäre es, wenn Sie vorschlagen, das Python-Programm asynchron auszuführen? Wäre das nicht der "natürliche" Weg, diesen Stillstand zu lösen? – Alfe

+0

@Alfe - das könnte eine gute Möglichkeit sein, es zu tun, aber ich sehe nicht, wie es der natürlichere Weg ist. Alles hängt von anderen Designproblemen ab, von denen wir nichts wissen. – tdelaney

+0

Ich nahm an, dass 'PyRun_SimpleFile' einen neuen Prozess startet, um den Python-Kram auszuführen, und wartet dann explizit auf die Beendigung des untergeordneten Prozesses. Mehr "natürlich" wäre nicht zu warten, weil wir alle Betriebssysteme verwenden, die Prozesse parallel laufen lassen. Ihre Antwort hat mich jedoch entfremdet. Kann die 'PyRun_SimpleFile' ihre Aufgabe innerhalb des aktuellen Prozesses ausführen? Dann wäre die Verwendung von Fifos im Allgemeinen wahrscheinlich die falsche Wahl. – Alfe

Verwandte Themen