[HN Gopher] How stdbuf works
___________________________________________________________________
How stdbuf works
Author : todsacerdoti
Score : 70 points
Date : 2022-11-11 14:38 UTC (8 hours ago)
(HTM) web link (hmarr.com)
(TXT) w3m dump (hmarr.com)
| bxparks wrote:
| Total tangent: What is the magic on that page that renders:
| if (putenv (var) != 0)
|
| as if (putenv (var) [?] 0)
|
| on my browser (Firefox)?
|
| When I try to copy that text, it copies as '!=' into my copypaste
| buffer.
| dubya wrote:
| On Safari the 'notequal' is double-width, and you can select
| just half of it, which I didn't expect.
| bxparks wrote:
| It's double wide on Firefox as well, and I could select half
| of it as well. I had to use a single "Unicode Character 'NOT
| EQUAL TO' (U+2260)" in my post on HN to describe what it
| looked like on my browser.
| kec wrote:
| They're using a webfont with a ligature for !=.
| hcm wrote:
| (Author here) I don't see that in Chrome so had no idea that
| was happening - thanks for pointing it out! I'm not a fan of
| coding ligatures so I just pushed a change to turn it off.
| bxparks wrote:
| Sheeet, I didn't even know that was possible. Why would they
| use that font for displaying C code? I looked at that [?] and
| spent a few minutes trying to figure out what language it
| was. Maybe I should uncheck the "Allow pages to choose their
| own fonts, instead of your selections above" option in
| Firefox, though it woulld probably break other websites.
| chrisshroba wrote:
| FYI Fira Code is one example of a very popular programming
| font that supports ligatures (67k stars on GitHub) [1]. But
| totally get the frustration of seeing ligatures on the web
| and not understanding what was going on!
|
| [1] https://github.com/tonsky/FiraCode
| Arnavion wrote:
| >Why would they use that font for displaying C code?
|
| Using ligature fonts for programming became popular a few
| years ago. As in some people even use them in their
| editors.
| bspammer wrote:
| Which is totally fine on their own machine, but using a
| webfont to force ligatures on anyone viewing their
| website is just confusing as a reader.
| Arnavion wrote:
| No, I get it. I don't use them either because I find them
| confusing. I'm just telling you you missed out on what
| was a quite popular trend from a few years ago.
| remram wrote:
| Lately my Firefox has been showing a ligature for "fi" in
| monospace code blocks, showing those two characters in
| the width of a single character. On every website with
| code blocks. It is mildly infuriating and I don't
| understand it.
| emmelaich wrote:
| There are desktop fonts that do that too. I tried it out, was
| too distracting.
| tptacek wrote:
| This was a fun read! It started out "TIL! Where has this `stdbuf`
| been all my life?", but then turned to "jfc, if that's how it
| works, no wonder I've never heard of this".
| [deleted]
| kazinator wrote:
| I recently integrated stdbuf logic in an embedded product.
| Basically same logic: set the LD_PRELOAD environment variable,
| taking care to extend LD_PRELOAD if it already has a value.
|
| This was part of an effort to redirect the output of sub-programs
| such as external command executions and daemons into the
| application's logging system (fork and capture stdout). Problem
| is, some things things redirected to a pipe will fully buffer
| their output so you don't get the output in a timely way.
|
| I noticed that the target system has a libstdbuf.so (even though
| its rootfs image lacks the stdbuf program) and the rest was
| history.
| arberx wrote:
| Great article!
|
| You can also use std::flush to get this behavior by default in
| the program.
| yjftsjthsd-h wrote:
| I wonder if it could add support for pretending to be a tty for
| the benefit of programs where the current approach doesn't work
| (ex. static binaries).
| cstrahan wrote:
| That's what unbuffer does, as mentioned in the article.
| doorman2 wrote:
| I was recently working with a bunch of pseudo-terminal stuff,
| so I was curious about how unbuffer works. One thing that
| stuck out to me in the manpages is this:
| Caveats unbuffer -p may appear to work
| incorrectly if a process feeding input to unbuffer exits.
| Consider: process1 | unbuffer -p process2 |
| process3 If process1 exits, process2 may not
| yet have finished. It is impossible for unbuffer to know long
| to wait for process2 and process2 may not ever finish, for
| example, if it is a filter. For expediency, unbuffer
| simply exits when it encounters an EOF from either its input
| or process2.
|
| Why does unbuffer care whether or not process2 exits? Can't
| it receive the EOF from process1, send it to process2, and
| then wait for process2 to exit? If process2 doesn't exit
| after receiving an EOF from stdin, then what's the issue
| about simply letting the pipeline hang? Isn't that what would
| happen without unbuffer?
| mzs wrote:
| from the expect FAQ, of which unbuffer is a part:
| #43. Why doesn't Expect kill telnet (or other programs)
| sometimes? From: libes (Don Libes) To:
| Karl.Sierka@Labyrinth.COM Subject: Re: need help
| running telnet Expect script from cron on sunos 4.1.3
| karl.sierka@labyrinth.com writes: > The only
| problem I am still having with the script I wrote is that
| > the telnet does not seem to die on it's own, unless I
| turn on debugging. Actually, Expect doesn't
| explicitly kill processes at all. Generally,
| processes kill themselves after reading EOF on input. So
| it just seems like Expect kills all of its children.
| > I was forced to save the pid of the spawned telnet,
| and kill it with an > 'exec kill $pid' in a proc
| that is hopefully called before the script >
| exits. This seems to work fine, but it makes me nervous
| since omnet > charges for connect time, and
| leaving a hung telnet lying around could > get
| expensive. I warned the rest of the staff so that they will
| also be > on the lookout for any possible hung
| telnets to omnet. The problem is that telnet
| is not recognizing EOF. (This is quite
| understandable since real users can't actually generate one
| from the telnet user interface.) The solution is to
| either 1) explicitly drive telnet to kill itself
| (i.e., a graceful logout) followed by "expect eof" or
| 2) "exec kill" as you are doing. This is
| described further in Exploring Expect beginning on page
| 103. Don
| doorman2 wrote:
| Thanks, that's is interesting background. From my pty
| experience, though, the answer is a bit unsatisfying. One
| reason is that I thought ^D generated an EOF in the
| terminal. For instance, if I use `wc` in the terminal, it
| reads from STDIN until I use ^D and then I get the
| output. Another reason is that it seems like a bug in the
| program to not respond to EOF. At the very least,
| unbuffer could offer an option? Anyway, I digress...
|
| The PTY interface in general feels a bit lacking.
| Normally, if you use a pipe, you can close to write end
| of the pipe to generate an EOF. With pseudo-terminals,
| you only have one file descriptor for writing input and
| reading output so you can't have the system generate an
| EOF without disabling your ability to read the output.
| syrrim wrote:
| ^D only does that in cooked input mode. In raw mode ^D
| send ^D, and it's up to the program to interpret that, or
| not. This is essential in, eg, telnet, since it wants to
| be able to open a session on a remote host that behaves
| exactly like a session on a local host, including its
| behaviour in response to ^D.
| KerryJones wrote:
| Anyone else misread "How Stuff Works"? No? Just me? Alright
| then...
___________________________________________________________________
(page generated 2022-11-11 23:01 UTC)