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/.