2012-11-20 2 views
5

system() La funzione è implementata utilizzando le funzioni fork(), execve() e wait(). Ho sentito che la funzione fork() è pericolosa nei programmi multi-thread. Quindi la funzione system() è pericolosa anche nei programmi multi-thread?È sicuro chiamare il sistema (3) dal processo multi-thread?

Quali problemi può causare?

+2

Controllare questo, questo può aiutare http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them – Intrepidd

risposta

1

fork è pericoloso nei programmi con filettatura a meno che seguito da execve. Poiché solo il thread corrente è biforcato, è possibile fare ben poco in un programma multi-threaded a forcella diverso da execve. Probabilmente dovresti assicurarti di non prendere nessun lucchetto dopo lo fork.

Poiché system() fa fork + exec, dovrebbe essere sicuro.

+1

Non è sicuro. I descrittori di file possono perdere –

1

Fork è pericoloso nei programmi con multithreading perché non copia tutti i thread in esecuzione. Dovrebbe essere ok con il sistema, ma se hai gestori di segnale e thread multipli wait() potresti ancora avere un casino.

2

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).