2012-11-20 7 views
5

system() chức năng được triển khai bằng cách sử dụng các chức năng fork(), execve()wait(). Tôi đã nghe nói rằng chức năng fork() rất nguy hiểm trong các chương trình đa luồng. Vì vậy, chức năng system() cũng có nguy hiểm trong các chương trình đa luồng không?Có an toàn khi gọi hệ thống (3) từ quy trình đa luồng không?

Có thể gây ra sự cố gì?

+2

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

Trả lời

1

fork rất nguy hiểm trong các chương trình luồng trừ khi theo sau là execve. Vì chỉ có chuỗi hiện tại được chia nhỏ nên có rất ít bạn có thể làm trong một chương trình đa luồng được chia nhỏ hơn execve. Bạn có thể chắc chắn rằng bạn không dùng bất kỳ ổ khóa nào sau fork.

system() không fork + exec, nên an toàn.

+1

Nó không an toàn. Trình mô tả tệp có thể bị rò rỉ –

1

Ngã ba nguy hiểm trong các chương trình đa luồng vì nó không sao chép tất cả các chuỗi đang chạy. Nó sẽ được ok với hệ thống, nhưng nếu bạn có xử lý tín hiệu và nhiều chủ đề chờ đợi() ing bạn lại có thể có một mớ hỗn độn.

2

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