What is the difference between using system() to execute a binary and using the combination of fork/execvp.
Is there any security/portablility/performance difference.
system()
will fork()
/exec()
the shell, and then shell will fork()
/exec()
the program you want to launch.
So system()
is twice as heavy as fork()
/exec()
System also uses a fork
/exec
... combination. If you do fork
/exec
yourself you can execute parallel to your running process, while system
is blocking (includes the wait
).
Also system
executes the command not direct, but via a shell (which makes problems with setuid bit) and system
blocks/ignores certain signals (SIGINT, SIGCHILD, SIGQUIT).
Yes, system()
runs the command through a shell, while exec()
runs the command directly. Of course, introducing a shell opens up for bugs and exploits.
Edit: of course, the man page provides more detail.
system() works on Windows but fork() doesn't.
Unless you use a compatibility layer such as Cygwin, but even then a fork can be very expensive.
there's also popen(), which is like system(), but allows to read child's output and provide input