Chức năng system()
không nhất thiết phải là chủ đề an toàn.
POSIX.1-2008 specifies (cũng như POSIX.1-2001): Hệ thống
() chức năng không cần thiết thread-safe.
Ví dụ, Solaris 10 documents system()
as thread-unsafe: Hệ thống
() chức năng thao túng các bộ xử lý tín hiệu cho SIGINT, SIGQUIT, và SIGCHLD. Do đó không an toàn với hệ thống gọi () trong một quy trình đa luồng, vì một số chủ đề khác điều khiển các trình xử lý tín hiệu này và một luồng đồng thời gọi hệ thống() có thể ảnh hưởng đến mỗi khác theo cách phá hoại.
Trang hướng dẫn này cũng gợi ý popen()
làm công việc an toàn theo chủ đề. Lưu ý rằng popen()
không thay đổi bất kỳ trình xử lý tín hiệu nào.
Trên Linux, system()
is thread-safe.
Lưu ý rằng system()
không nhất thiết phải gọi fork()
. Thay vào đó, triển khai có thể sử dụng vfork()
. Hoặc, trên Linux, nó có thể gọi trực tiếp clone()
. Nó thậm chí có thể sử dụng posix_spawn()
.
Mặc dù forking in a multi-threaded program can be challenging, một ngã ba trực tiếp theo sau bởi một exec là an toàn, nói chung (modulo mở tập tin mô tả).
Kiểm tra điều này, điều này có thể giúp http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them – Intrepidd