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