eidheim / tiny-process-library

A small platform independent library making it simple to create and stop new processes in C++, as well as writing to stdin and reading from stdout and stderr of a new process
MIT License
338 stars 73 forks source link

Exit on Process::write on linux #28

Open smurfy opened 6 years ago

smurfy commented 6 years ago

I have a problem not reliable getting outputs. A workaround i found is, sending "\n" via Process::write

My Problem now is, that if the process exits write causes a crash. (my program just exits without any error message or exception). I added log messages before and after the actual write call and the after message is never printed.

I do a pid check before the actual write, but i still have the exit. My code is loosely based on Example 8, but with output buffer.

Any idea how to avoid the program to exit. Also any idea why the output is not really reliable?

smurfy commented 6 years ago

OK, the exit/crash is due to SIGPIPE (Broken Pipe) errors. Can be fixed by adding signal(SIGPIPE, SIG_IGN);

Question would be, is is somehow possible to open the pipes (mainly stdin) with MSG_NOSIGNAL

eidheim commented 6 years ago

Thank you for investigating this. To my understanding, if signal(SIGPIPE, SIG_IGN); is used, one would not need to open stdin with MSG_NOSIGNAL?

smurfy commented 6 years ago

yes, but this will ignore all SIGPIPE signals.

Most of the time you probably won't need them, but i would not want a library to ignore the signal globally.

So MSG_NOSIGNAL would be the better choice. (if possible at all, i know its supported by sockets not sure regarding normal pipes or a way which works with pipes)

If MSG_NOSIGNAL is not possible i would suggest just adding the info about ignoring / handling SIGPIPE signals if stdin is used to the readme.