I'm currently reading up on and experimenting with the different possibilities of running programs from within C code on Linux. My use cases cover all possible scenarios, from simply running and forgetting about a process, reading from or writing to the process, to reading from and writing to it.
For the first two,
popen() is very easy to use and works well. I understand that it uses some version of
exec() internally, then invokes a shell to actually run the command.
For the third scenario,
popen() is not an option, as it is unidirectional. Available options are:
posix_spawn(), which internally uses the above as need be
What I noticed is that these can achieve the same that
popen() does, but we can completely avoid the invoking of an additional
sh. This sounds desirable, as it seems less complex.
However, I noticed that even examples on
posix_spawn() that I found on the Internet do invoke a shell, so it would seem there must be a benefit to it. If it is about parsing command line arguments,
wordexp() seems to do an equally good job.
What is the
reason behind benefit of invoking a shell to run the desired process instead of running it directly?
Edit: I realized that my wording of the question didn't precisely reflect my actual interest - I was more curious about the benefits of going through
sh rather than the (historical) reason, though both are obviously connected, so answers for both variations are equally relevant.