nixp.ru v3.0

16 ноября 2024,
суббота,
08:19:03 MSK

Fatal написал 2 июня 2005 года в 12:06 (1763 просмотра) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

объясните, пожалуйста, следующее:

почему не работает tcpdump -i lo0 > file ?

на другом терминале я ввожу:

ping -c4 localhost

а, файл остаётся пустым, почему так?

slice

#tcpdump -i lo -l | tee file

отобразит работу tcpdump и сохранит результат в файле.

Fatal

спасибо!

можно и так tcpdump -i lo0 -l > file, ну это не важно.

важно то, что судя по ключу -l нельзя перенаправить не буферезированный вывод!

или я ошибаюсь?

Fatal

я ошибаюсь. проверил я, написав маленькую прогу (игра на том, что write() не буферезируется).

#include

int main(void)

{

 char str[] = «Hello!\n»;

 write(1, str, sizeof(str)-1);

 return 0;

}

результат:

# cc output.c

# ./a.out > file

# cat file

Hello!

..#

хотя в man tcpdump написано про ключ -l

Make stdout line buffered.

то есть без этого ключа stdout не буферезированный…

и значит, что не буферезированный поток не перенаправляется, хотя моя прога показала, что это ошибочно.

в чём фишка? почему с ключём -l перенаправляется, а без него нет?

проверял на FreeBSD 5.3

slice

У меня работают оба варианта, система — ASPLinux.

У тебя точно есть интерфейс lo1?

Fatal

вы хотите сказать, не lo1, а lo0?

tcpdump выдаёт:

# tcpdump -D

1. lnc0

2. lo0

slice

может это особенности версии для BSD? Пробовал под линь?

Fatal

не пробовал, у меня нет его. думаю достаточно, что вы попробовали.

Genie

скорее всего действует то, что при указании -l в процессе вывода вызывается flush над stdout.

таким образом, вывод в файл производится не целым буфером, а несколькими строчками.

без указания этого ключа вывод в файл происходит по двум событиям: заполнении буфера, закрытия дескриптора файла.

а так как время выполнения tcpdump несколько продложительное, то…. второе событие может не наступать очень долго.

и остаётся только одна причина.

проверил бы ты её, а? ;)

Fatal
Genie
скорее всего действует то, что при указании -l в процессе вывода вызывается flush над stdout.

таким образом, вывод в файл производится не целым буфером, а несколькими строчками.

без указания этого ключа вывод в файл происходит по двум событиям: заполнении буфера, закрытия дескриптора файла.

а так как время выполнения tcpdump несколько продложительное, то…. второе событие может не наступать очень долго.

и остаётся только одна причина.

проверил бы ты её, а? ;)

без ключа строки выводятся в stdout, значит эти строки выбрасываются из буфера, выбрасывание скорее всего происходит при выводе новой строки. Поэтому даже если файл выводится несколькими строчками он должен перенаправляться в файл.

Последние комментарии

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.