Il faut que tu comprennes ce que tu fais. La communication inter-process, c'est assez comliqué, et ça peut bloquer pour plein de raisons. Poses-toi les bonnes questions:
- Via quel fichier/pipe/stream est-ce que je communique ?
- Es-ce que l'écrivain, le lecteur, l'os entre les deux, a un buffer ?
- Est-ce que je dois réagir dans tous les cas si quelqu'un fonctionne mal (il faut faire de l'asynchrone) ?
- Est-ce qu'il y aura plusieurs instances lancées en parallèle (attention aux concurrences) ?
- Mes pipes sont-ils bien du bon type (ex: tu essayes d'utiliser un fichier comme une fifo, pas d'erreurs mais comportement inattendu)
- etc
La communication inter-process, c'est compliqué. Voici un petit exemple fonctionnel pour t'aider à te lancer:
C++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <fstream> #include <thread> #include <chrono> #include <unistd.h> using namespace std::literals::chrono_literals; int main(int argc, char* argv[]) { std::ofstream output_stream("myfifo"); if (output_stream) { for (int i = 0; i < 10; ++i) { std::this_thread::sleep_for(200ms); // Wait 200ms output_stream << i << "\n" << std::flush; } } // else error : could not open fifo return 0; }
Python
A lancer idéalement en mode "unbuffered":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #!/usr/bin/env python # -*- encoding:utf-8 -*- import os, subprocess,stat, sys # Check we have a fifo if os.path.exists("myfifo"): if 0 == stat.S_ISFIFO(os.stat("myfifo").st_mode): print "Error: not a fifo" sys.exit(1) else: os.mkfifo("myfifo") # Launch C++ process = subprocess.Popen(["./main"]) # Print with open("myfifo") as fp: while True: line = fp.readline() if line == "": # End of file, C++ is done break else: print(line) # Be careful, "print" adds another "\n" # Waid end of process process.wait()
Code : Sélectionner tout - Visualiser dans une fenêtre à part python -u main.py
Partager