Strona 1 z 1
[c++]uruchamianie programu w programie
: 03 sty 2009, 18:33
autor: none
Witam mam pytanie jakiej funkcji mam użyć by odczytać wyjsćie programu uruchamianego w programie. Znalazłem funkcje execle(); ale ona zwraca int, a szukam funkcji która poda mi wyjście programu.
Odp: [c++]uruchamianie programu w programie
: 03 sty 2009, 19:14
autor: moridin
none pisze:Znalazłem funkcje execle(); ale ona zwraca int, a szukam funkcji która poda mi wyjście programu.
Z manuala do exec'a:
Kod: Zaznacz cały
WARTOŚĆ ZWRACANA
Jeśli dowolna z funkcji exec powróci, oznacza to że nastąpił błąd. Zwracana jest wartość -1 i ustawiana jest zmienna globalna errno aby wskazać błąd.
Dawno nie pisalem bezposrednio na linucha ale sprobuje pomoc.
Pamietam ze sama funkcja z rodziny exec nic nie da. Trzeba uzyc tak zwanej komunikacji miedzyprocesowej. Mamy tu do wyboru sporo mozliwosci: pamiec wspoldzielona, semafory procesow, odwzorowanie w pamieci, potoki, gniazda czy tez chocby zwykle pliki. Powinienes na ten temat poczytac.
Tutaj na szybko znaleziony program w c dla potokow (pipe):
http://www.cs.usfca.edu/~benson/cs326/l ... ipe-exec.c
Odp: [c++]uruchamianie programu w programie
: 04 sty 2009, 11:57
autor: el.pescado
Po pierwsze, funkcje z rodziny exec() w ogóle nie zwracają wartości - funkcje te uruchamiają nowy proces w miejscu bieżącego procesu, tak więc kontrola nigdy (chyba że wystąpi błąd) nie wraca do punktu wywołania funkcji exec().
Jeżeli chcesz po prostu odczytać wyjście (albo pisać do wejścia) innego procesu, bez wchodzenia w szczegóły, najprościej jest posłużyć się funkcjami popen(3)/pclose(3) ze standardowej biblioteki języka C. popen zwraca wskaźnik do strumienia, z którego korzytsa się dokładnie tak, jakby to był plik otwarty za pomocą funkcji fopen.
Natomiast jeżeli wystarczy sam kod zakończenia programu (tj. wartość zwrócona przez funkcję main tego programu), można użyć funkcji system(3), również znajdującą się w standardowej bibliotece języka C.
Jeżeli nie chcesz korzystać ze standardowej biblioteki języka C, a wolisz wywołania systemowe POSIX, poczytaj o funkcjach fork(2), exec(2), pipe(2), dup2(2) - ogólnie, jest z tym trochę więcej roboty.