Omijanie buforowania wyjścia podprocesu popen w C lub Pythonie
Mam ogólne pytanie o popen (i wszystkich powiązanych funkcjach), odnoszące się do wszystkich systemów operacyjnych, kiedy piszę skrypt Pythona lub jakiś kod c i uruchamiam wynikowy plik wykonywalny z konsoli (win lub linux), mogę natychmiast zobaczyć wyjście z procesu. Jednakże, jeśli uruchomię ten sam plik wykonywalny, co rozwidlony proces ze swoim stdout przekierowanym do potoku, bufory wyjściowe gdzieś, zwykle do 4096 bajtów, zanim zostaną zapisane w potoku, gdzie proces macierzysty może je odczytać.
Poniższy skrypt Pythona wygeneruje dane wyjściowe w porcjach po 1024 bajty
import os, sys, time
if __name__ == "__main__":
dye = '@'*1024
for i in range (0,8):
print dye
time.sleep(1)
Następujący skrypt Pythona wykona poprzedni skrypt i odczyta dane wyjściowe, gdy tylko dotrze do potoku, bajt po bajcie
import os, sys, subprocess, time, thread
if __name__ == "__main__":
execArgs = ["c:\\python25\\python.exe", "C:\\Scripts\\PythonScratch\\byte_stream.py"]
p = subprocess.Popen(execArgs, bufsize=0, stdout=subprocess.PIPE)
while p.returncode == None:
data = p.stdout.read(1)
sys.stdout.write(data)
p.poll()
Dostosuj ścieżkę do swojego systemu operacyjnego. Po uruchomieniu w tej konfiguracji, wyjście nie pojawi się w porcjach po 1024, ale porcje po 4096, mimo że rozmiar bufora polecenia popen jest ustawiony na 0 (co i tak jest domyślne). Czy ktoś może mi powiedzieć, jak zmienić to zachowanie? Czy jest jakiś sposób, w jaki mogę zmusić system operacyjny do traktowania danych wyjściowych z rozwidlonego procesu w taki sam sposób, jak przy uruchamianiu z konsoli? bez buforowania?