From: Rob Landley Date: Sun, 12 Feb 2006 00:45:39 +0000 (-0000) Subject: More random documentation. X-Git-Tag: 1_1_0~229 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=c29a0f371a8b5409f79e88f26d00c7d9fc2caa4f;p=oweals%2Fbusybox.git More random documentation. --- diff --git a/docs/busybox.net/programming.html b/docs/busybox.net/programming.html index 6dbe6931f..99fdaacb7 100644 --- a/docs/busybox.net/programming.html +++ b/docs/busybox.net/programming.html @@ -16,6 +16,7 @@ @@ -298,6 +299,39 @@ each other while traversing the free memory lists). The thing about vfork is that it's a big red flag warning "there be dragons here" rather than something subtle and thus even more dangerous.)

+

Short reads and writes

+ +

Busybox has special functions, bb_full_read() and bb_full_write(), to +check that all the data we asked for got read or written. Is this a real +world consideration? Try the following:

+ +
while true; do echo hello; sleep 1; done | tee out.txt
+ +

If tee is implemented with bb_full_read(), tee doesn't display output +in real time but blocks until its entire input buffer (generally a couple +kilobytes) is read, then displays it all at once. In that case, we _want_ +the short read, for user interface reasons. (Note that read() should never +return 0 unless it has hit the end of input, and an attempt to write 0 +bytes should be ignored by the OS.)

+ +

As for short writes, play around with two processes piping data to each +other on the command line (cat bigfile | gzip > out.gz) and suspend and +resume a few times (ctrl-z to suspend, "fg" to resume). The writer can +experience short writes, which are especially dangerous because if you don't +notice them you'll discard data. They can also happen when a system is under +load and a fast process is piping to a slower one. (Such as an xterm waiting +on x11 when the scheduler decides X is being a CPU hog with all that +text console scrolling...)

+ +

So will data always be read from the far end of a pipe at the +same chunk sizes it was written in? Nope. Don't rely on that. For one +counterexample, see rfc 896

+for Nagle's algorithm, which waits a fraction of a second or so before +sending out small amounts of data through a TCP/IP connection in case more +data comes in that can be merged into the same packet. (In case you were +wondering why action games that use TCP/IP set TCP_NODELAY to lower the latency +on their their sockets, now you know.)

+