La funzione system()
non è necessariamente thread-safe.
POSIX.1-2008 specifies (nonché POSIX.1-2001): funzione
Sistema() non deve essere thread-safe.
Ad esempio, Solaris 10 documents system()
as thread-unsafe:
Sistema() funzione manipola i gestori di segnale per SIGINT, SIGQUIT e SIGCHLD. Non è quindi sicuro chiamare il sistema di chiamata () in un processo multithread, poiché un altro thread che manipola questi gestori di segnale e un thread che chiama simultaneamente system() può interferire con ciascun in modo distruttivo.
Questa pagina man suggerisce anche popen()
come soluzione di sicurezza thread-around. Si noti che popen()
non modifica alcun gestore di segnale.
Su Linux, system()
is thread-safe.
Si noti che system()
non chiama necessariamente fork()
. Un'implementazione potrebbe utilizzare vfork()
, invece. Oppure, su Linux, potrebbe chiamare direttamente clone()
. Potrebbe anche usare posix_spawn()
.
Anche se forking in a multi-threaded program can be challenging, un fork seguito direttamente da un exec è sicuro, in generale (descrittori di file aperti modulo).
Controllare questo, questo può aiutare http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them – Intrepidd