NAZWA¶
popen, pclose - we/wy procesu
SKŁADNIA¶
#include <stdio.h>
FILE *popen(const char *command, const char
*type);
int pclose(FILE *stream);
OPIS¶
Uwaga! To tłumaczenie może być nieaktualne!
Funkcja
popen() otwiera proces, tworząc łącze,
rozwidlając się przez fork() i wywołując
powłokę. Ponieważ łącze jest z definicji
jednokierunkowe, argument
type może określać tylko
odczyt albo tylko zapis, nie oba naraz. Otrzymany w wyniku tego
strumień będzie tylko do odczytu albo tylko do zapisu.
Argument
command jest wskaźnikiem do zakończonego znakiem
NUL łańcucha, zawierającego wiersz poleceń
powłoki. Polecenie to jest przekazywane do
/bin/sh przy
użyciu opcji
-c; wszelka interpretacja jest dokonywana przez
powłokę. Argument
type jest zakończonym znakiem
NUL łańcuchem, który musi być albo `r', albo `w'
(odpowiednio dla odczytu i zapisu).
Wartość zwracana przez
popen() to normalny strumień
we/wy, lecz powinien on być zamykany przy użyciu
pclose()
zamiast
fclose(). Zapisywanie do takiego strumienia powoduje pisanie na
standardowe wejście polecenia. Standardowe wyjście polecenia
jest takie samo, jak procesu, który wywołał
popen(), chyba że zostało to zmienione przez polecenie.
Podobnie, odczyt z tak otwartego strumienia powoduje odczyt ze standardowego
wyjścia polecenia, a standardowe wejście polecenia jest wtedy
tożsame z wejściem procesu, który wywołał
popen().
Należy zauważyć, że strumienie wyjściowe
powstałe z
popen są domyślnie w pełni
buforowane.
Funkcja
pclose oczekuje na zakończenie stowarzyszonego procesu i
zwraca jego kod zakończenia, podobnie jak to czyni
wait4.
WARTOŚĆ ZWRACANA¶
Funkcja
popen zwraca
NULL jeśli nie powiodły
się wywołania
fork(2) lub
pipe(2), lub
jeśli nie udało się przydzielić pamięci.
Funkcja
pclose zwraca -1 jeśli
wait4 zwróci
błąd lub zostały wykryte jakieś inne
błędy.
BŁĘDY¶
Funkcja
popen nie ustawia
errno, jeżeli nie uda się
przydzielić pamięci. Jeżeli nie powiodą się
wywoływane przez nią
fork() lub
pipe(), to
errno będzie odpowiednio ustawione. Jeżeli argument
mode będzie nieprawidłowy i zostanie to wykryte, to
errno zostanie ustawione na
EINVAL.
Jeżeli nie będzie możliwe otrzymanie kodu
zakończenia procesu potomnego przez
pclose(), to
errno
zostanie ustawione na
ECHILD.
ZGODNE Z¶
POSIX.2
USTERKI¶
Ponieważ offset standardowego wejścia polecenia otwartego dla
odczytu jest taki sam dla tego polecenia i dla procesu, który
wywołał
popen(), więc jeśli oryginalny
proces wykona buforowany odczyt, to pozycja na wejściu polecenia
może być inna niż oczekiwano. Podobnie, wyjście
polecenia otwartego dla zapisu może zostać wymieszane z
wyjściem procesu oryginalnego. Temu ostatniemu można zapobiec,
wołając przed
popen funkcję
fflush(3).
Błąd w wywołaniu powłoki jest
nieodróżnialny od błędu powłoki przy
wywoływaniu polecenia, czy od natychmiastowego zakończenia
polecenia. Jedynym śladem jest kod zakończenia równy 127.
HISTORIA¶
Funkcje
popen() i
pclose() pojawiły się w wersji 7
AT&T UNIX.
ZOBACZ TAKŻE¶
fork(2),
sh(1),
pipe(2),
wait4(2),
fflush(3),
fclose(3),
fopen(3),
stdio(3),
system(3)
Powyższe tłumaczenie pochodzi z nieistniejącego już
Projektu Tłumaczenia Manuali i
może nie być
aktualne. W razie zauważenia różnic między
powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub
funkcji, prosimy o zapoznanie się z oryginalną
(angielską) wersją strony podręcznika za pomocą
polecenia:
- man --locale=C 3 popen
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.