2011-12-16 68 views
16

Tôi muốn thực hiện một nhị phân trong mã C của tôi là gì. Cách nào tốt hơn để thực thi? popen() hoặc system()sự khác biệt giữa popen() và hệ thống() trong C

EDIT: Tôi cố gắng sử dụng system, nhưng quá trình thực hiện dường như gặp khó khăn cuối cùng và không quay trở lại mã của tôi.

Bất kỳ đề xuất nào về việc cần làm?

Cảm ơn

+4

'man popen' và' man system'? –

+0

Bạn đã thử sử dụng popen() chưa? hoặc vấn đề của nó với bạn nhị phân? Bạn chỉnh sửa lần cuối là hơi bối rối – henryyao

+0

Để sử dụng 'popen' thay vì' system' không giúp được vấn đề thực tế của bạn: quá trình bị kẹt. – Wolf

Trả lời

25

popen() cung cấp cho bạn kiểm soát đầu vào hoặc tập tin đầu ra suối của quá trình. system() thì không. Nếu bạn không cần truy cập vào I/O của quy trình, bạn có thể sử dụng system() để đơn giản.

system() nằm trong C89 và C99; popen() chỉ là Posix (mặc dù API Windows cũng có một).

Cả hai chức năng gọi một số hình thức của một vỏ để thực hiện lệnh (ví dụ /bin/sh trên Linux, và có lẽ cmd.exe trên Windows). Nếu bạn muốn thực thi tệp thực thi trực tiếp và bạn đang ở trên Posix, bạn cũng có thể xem exec* -gia đình các hàm kết hợp với fork() (từ exec()thay thế quy trình hiện tại).

+3

+1, tôi không bao giờ nhận ra popen gọi vỏ. –

+1

@HeathHunnicutt: Tôi đã làm gì cho đến năm phút trước, khi tôi theo lời khuyên của Joachim :-) –

+3

Lưu ý quan trọng về 'popen': Nó cho phép bạn kiểm soát luồng đầu vào ** OR **, chứ không phải cả hai. –

4

Sử dụng popen nếu bạn muốn chạy lệnh trình bao và muốn quy trình cha mẹ có thể nói chuyện với trẻ. (Nó móc đầu vào hoặc đầu ra của đứa trẻ lên đến luồng bạn lấy lại.) Nếu không, hãy thích gia đình của các hàm (fork) exec. Các quá trình d thừa kế hầu hết các mô tả tập tin mở (bao gồm stdin, stdout và stderr), vì vậy bạn có thể móc đầu vào đầu ra theo bất cứ thứ gì bạn thích ... cộng với ít tác động bảo mật hơn.

system nói chung là tránh tốt nhất trừ khi bạn phải chạy lệnh shell. Nó sinh ra một shell để chạy lệnh và shell có thể phân tích cú pháp lệnh theo bất kỳ cách nào nó thích. Cụ thể, một số biến môi trường nhất định (như $IFS và/hoặc $PATH) có thể được sửa đổi theo cách sao cho phụ huynh thực thi các chương trình mà bạn không bao giờ dự định. Mặc dù popen dường như làm điều tương tự, ít nhất nó cũng cung cấp chức năng làm cho nó đáng giá trong trường hợp chung.

+0

Bạn chỉ có thể thực hiện * hoặc * đầu vào * hoặc * đầu ra, tôi tin. 'popen()' cũng sinh ra một shell. –

Các vấn đề liên quan