On 2/19/21 5:41 AM, kdevel wrote:
On Friday, 19 February 2021 at 08:37:50 UTC, Imperatorn wrote:
Does your iopipe handle... Pipes? 😀

BTW: What about SIGPIPE?

In an experimental code I have this

    :
    fout.rawWrite (buf);
    fout.rawWrite ("\n");
    writeln ("flushing");
    fout.flush ();                                    // (a)
    enforce (! fout.eof, "eof on write to child");    // (b)
    writeln ("reading from pipe");
    :

fout actually is the child's stdin. Sometimes between (a) and (b)
a SIGPIPE occurs and terminates the process (exit code 141). That
prevents the proper handling of eof.

Why isn't SIGPIPE blocked or handled by default?

ignoring SIGPIPE is a process-wide thing, and so it's not appropriate for Phobos to make that decision for you. But it's trivial to ignore it.

I've never been a fan of SIGPIPE. If you look around on the Internet, you'll find that most people agree that the reasoning for SIGPIPE is to fix poor programming (i.e. ignoring of error codes). But it doesn't give you any good way to handle it. A SIGPIPE can be due to any pipe being written, it doesn't tell you which one. In order to know which one caused it, well, you have to look at the error code of the call!

The end result is -- it makes poor programming the standard. If you ignore SIGPIPE for a child process, then if that process' operation depends on SIGPIPE killing it, then you have screwed over that child process, or rather, exposed the lack of error checking in the child process.

-Steve

Reply via email to