Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, Linux] Jak wyłączyć buforowanie potoków?

Ostatnio zmodyfikowano 2015-07-20 12:23
Autor Wiadomość
DejaVu
Temat założony przez niniejszego użytkownika
[C++, Linux] Jak wyłączyć buforowanie potoków?
» 2015-07-17 20:34:56
C/C++
cmn::Subprocess app;
app.open( "grep costam" );

std::wstring row;
while( app.readLine( row ) )
     wprintf( L"Line: %ls\n", row );

Mam sobie powyższy program, który uruchamia drugi proces. Problem w tym, że pipe buforuje dane i tym samym wyników nie otrzymuję co wiersz, lecz co 4KB danych. Czy ktoś z Was wie jak wyłączyć buforowanie potoku lub jak rozwiązać problem w inny sposób?
P-134849
Elaine
» 2015-07-18 10:09:16
Problem w tym, że pipe buforuje dane
Nie pipe, tylko grep.

man grep
man stdbuf
P-134858
DejaVu
Temat założony przez niniejszego użytkownika
» 2015-07-18 13:06:35
A grep nie buforuje przypadkiem danych po jednym wierszu?

/edit:
Sprawdzę na dniach czy zadziała http://linux.die.net/man/2​/fsync.

oraz czy zadziała to co wspomniałeś o grepie (http://linux.die.net/man/2​/fsync) tj.
C/C++
app.open( "grep --line-buffered costam" );
P-134860
Elaine
» 2015-07-19 01:41:26
A grep nie buforuje przypadkiem danych po jednym wierszu?
Nie. Możesz się łatwo przekonać sam, wykonując grep foo | cat.
Sprawdzę na dniach czy zadziała http://linux.die.net/man/2​/fsync.
To nie ma sensu, fsync służy do opróżniania bufora wyjściowego należącego do FILE*. Miałoby sens, gdybyś wywoływał to w procesie grepa, ale zabawa z tym jest jeszcze bardziej bez sensu.

…oczywiście używasz pipe, nie popen?
P-134883
DejaVu
Temat założony przez niniejszego użytkownika
» 2015-07-19 11:25:58
Tak, używam pipe do utworzenia deskryptorów, a po wykonaniu forka w procesach używam dup2.
P-134896
DejaVu
Temat założony przez niniejszego użytkownika
» 2015-07-20 12:23:14
Grep faktycznie był źródłem problemów, a nie potoki. Dzięki!
P-134957
« 1 »
  Strona 1 z 1