2011-12-16 11 views
16

Chcę wykonać plik binarny w moim C-Code. Które lepiej wykonać przy pomocy? popen() lub system()Jaka jest różnica między popen() i system() w C

EDIT: próbowałem użyć system, ale proces wykonywania wydaje się utknąć w końcu i nie wrócić do mojego kodu.

Wszelkie sugestie dotyczące tego, co należy zrobić?

Dzięki

+4

'man popen' and' man system'? –

+0

Czy próbowałeś użyć funkcji popen()? lub jego problem z tobą binarnym? Ostatnia edycja jest nieco myląca – henryyao

+0

Używanie 'popen' zamiast' system' nie pomaga w twoim rzeczywistym problemie: proces utknął. – Wolf

Odpowiedz

25

popen() daje kontrolę nad wejściowych strumieni lub plik wyjściowy w procesie. system() nie. Jeśli nie potrzebujesz dostępu do operacji we/wy, możesz użyć prostszej metody: system().

system() jest w C89 i C99; popen() jest tylko posixem (choć Windows API również go posiada).

Obie funkcje wywołać niektóre forma skorupy aby wykonać polecenie (np /bin/sh na Linuksie, i prawdopodobnie cmd.exe Windows). Jeśli chcesz wykonać plik wykonywalny bezpośrednio i jesteś na Posix, możesz także spojrzeć na rodzinę funkcji exec* w połączeniu z fork() (od exec()zastępuje bieżący proces).

+3

+1, nigdy nie zdawałem sobie sprawy, że popen wywołuje powłokę. –

+1

@HeathHunnicutt: Ani ja aż pięć minut temu, kiedy poszedłem za radą Joachima :-) –

+3

Ważna uwaga na temat 'popen': Daje ci kontrolę nad wejściowym strumieniem wyjściowym ** LUB **, a nie obydwoma. –

4

Użyj polecenia popen, jeśli chcesz uruchomić polecenie powłoki i chcesz, aby proces nadrzędny mógł rozmawiać z dzieckiem. (Przechwytuje dane wejściowe lub wyjściowe dziecka do strumienia, który otrzymujesz.) W przeciwnym razie wybierz rodzinę funkcji (prawdopodobnie w połączeniu z fork); exec Procesy "d" dziedziczą większość otwartych deskryptorów plików (w tym stdin, stdout i stderr), dzięki czemu można przechwytywać dane wyjściowe i na dowolne wyjście ... a ponadto ma to mniejszy wpływ na bezpieczeństwo.

system na ogół najlepiej unikać, chyba że musisz uruchamiać polecenia powłoki. Tworzy powłokę, aby uruchomić polecenie, a powłoka może analizować komendę w dowolny sposób. W szczególności niektóre zmienne środowiskowe (takie jak $IFS i/lub $PATH) mogą być modyfikowane w taki sposób, aby spowodować, że rodzic wykona programy, do których nigdy nie był przeznaczony. Chociaż wydaje się, że popen robi to samo, to przynajmniej zapewnia funkcjonalność, która sprawia, że ​​jest to warte w ogólnym przypadku.

+0

Można tylko wykonać * albo * wejście * lub * wyjście, wierzę. 'popen()' również spawnuje powłokę. –

Powiązane problemy