Câu hỏi của bạn dường như kêu gọi một câu trả lời trong rừng và câu trả lời ở đây có vẻ giống như câu trả lời của cây, vì vậy tôi nghĩ rằng tôi sẽ cho bạn một câu trả lời về rừng.
Điều này rất hiếm khi các chương trình C được viết. Nó luôn luôn là cách các kịch bản shell được viết và đôi khi các chương trình Python, perl hoặc Ruby được viết như thế nào.
Mọi người thường viết bằng C để dễ dàng sử dụng các thư viện hệ thống và truy cập trực tiếp ở mức độ thấp vào các cuộc gọi hệ điều hành cũng như tốc độ. Và C là một ngôn ngữ khó viết, vì vậy nếu mọi người không cần những thứ đó, thì họ không sử dụng C. Ngoài ra, các chương trình C thường được dự kiến chỉ có phụ thuộc vào thư viện chia sẻ và tệp cấu hình.
Tách ra một quy trình phụ không đặc biệt nhanh và nó không yêu cầu quyền truy cập chi tiết và có kiểm soát vào các cơ sở hệ thống cấp thấp, và nó đưa ra một sự phụ thuộc đáng ngạc nhiên vào một thực thi bên ngoài, vì vậy rất hiếm khi thấy trong các chương trình C.
Có một số mối quan tâm bổ sung. Các mối quan tâm về bảo mật và tính di động mà mọi người đề cập là hoàn toàn hợp lệ. Tất nhiên chúng có giá trị như nhau đối với tập lệnh shell, nhưng mọi người đang mong đợi những loại vấn đề đó trong tập lệnh shell. Nhưng các chương trình C thường không có mối quan tâm bảo mật này, điều này làm cho nó nguy hiểm hơn.
Nhưng, theo tôi, mối quan tâm lớn nhất liên quan đến cách thức popen
sẽ tương tác với phần còn lại của chương trình của bạn. popen
phải tạo một tiến trình con, đọc đầu ra của nó và thu thập trạng thái thoát của nó. Trong khi đó, stderr của quá trình đó sẽ được kết nối với stderr tương tự như chương trình của bạn, điều này có thể gây ra đầu ra khó hiểu và stdin của nó sẽ giống như chương trình của bạn, điều này có thể gây ra các vấn đề thú vị khác. Bạn có thể giải quyết điều đó bằng cách đưa </dev/null 2>/dev/null
vào chuỗi bạn chuyển đến popen
vì nó được giải thích bởi trình bao.
Và popen
tạo ra một quá trình con. Nếu bạn làm bất cứ điều gì với việc xử lý tín hiệu hoặc tự xử lý quá trình, bạn có thể sẽ nhận được SIGCHLD
tín hiệu kỳ lạ . Các cuộc gọi của bạn wait
có thể tương tác kỳ lạ với popen
và có thể tạo ra các điều kiện cuộc đua kỳ lạ.
Tất nhiên, mối quan tâm về bảo mật và tính di động là có. Vì chúng dành cho các kịch bản shell hoặc bất cứ thứ gì khởi động các tệp thực thi khác trên hệ thống. Và bạn phải cẩn thận mà mọi người sử dụng chương trình của bạn không thể nhận được vỏ meta-charcaters vào chuỗi bạn vượt qua thành popen
vì chuỗi được đưa trực tiếp đến sh
với sh -c <string from popen as a single argument>
.
Nhưng tôi không nghĩ họ là lý do tại sao thật lạ khi thấy một chương trình C sử dụng popen
. Lý do nó lạ là vì C thường là ngôn ngữ cấp thấp và popen
không phải là cấp độ thấp. Và bởi vì việc sử dụng các popen
ràng buộc thiết kế vị trí trên chương trình của bạn bởi vì nó sẽ tương tác kỳ lạ với đầu vào và đầu ra tiêu chuẩn của chương trình của bạn và khiến cho việc quản lý quy trình hoặc xử lý tín hiệu của bạn trở nên khó khăn. Và bởi vì các chương trình C thường không được dự kiến sẽ có sự phụ thuộc vào các tệp thực thi bên ngoài.