popen(3) Library Functions Manual popen(3)

popen, pclose - strumieniuje potok do lub z procesu

Standardowa biblioteka C (libc, -lc)

#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

popen(), pclose():

    _POSIX_C_SOURCE >= 2
        || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

Funkcja popen() otwiera proces, tworząc potok, rozwidlając się przez fork() i wywołując powłokę. Ponieważ potok jest z definicji jednokierunkowy, 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 wskaźnikiem do łańcucha zakończonego znakiem null, który musi zawierać albo literę „r” (do odczytu), albo literę „w” (do zapisu). Od glibc 2.9, argument ten może dodatkowo obejmować literę „e”, co powoduje ustawienie znacznika zamknięcia przy wykonaniu (FD_CLOEXEC) na przedmiotowym deskryptorze pliku; powody, dla których może być to użyteczne opisano przy znaczniku O_CLOEXEC w podręczniku open(2).

Wartość zwracana przez popen() to normalny strumień wejścia/wyjścia, lecz powinien on być zamykany przy użyciu pclose() zamiast fclose(3). 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(2).

popen: przy powodzeniu zwraca wskaźnik do otwartego strumienia, który może służyć do odczytu lub zapisu do potoku; jeśli nie powiodły się wywołania fork(2) lub pipe(2), lub jeśli nie udało się przydzielić pamięci, zwracane jest NULL.

pclose: przy powodzeniu zwraca status zakończenia polecenia; jeśli wait4 zwróci błąd lub zostały wykryte jakieś inne błędy, zwracane jest -1.

W przypadku błędu, obie funkcje ustawiają errno, wskazując błąd.

Funkcja popen() nie ustawia errno, jeżeli nie uda się przydzielić pamięci. Jeżeli nie powiodą się wywoływane przez nią fork(2) lub pipe(2), to ustawione będzie errno, wskazując błąd. Jeżeli argument type 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.

Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).

Interfejs Atrybut Wartość
popen(), pclose() Bezpieczeństwo wątkowe MT-bezpieczne

Wartość „e” dla type jest rozszerzeniem systemu Linux.

POSIX.1-2008.

POSIX.1-2001.

Proszę dokładnie zapoznać się z Zastrzeżeniami w podręczniku system(3).

Przesunięcie standardowego wejścia polecenia otwartego do odczytu jest takie samo dla tego polecenia i dla procesu, który wywołał popen(), zatem 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.

sh(1), fork(2), pipe(2), wait4(2), fclose(3), fflush(3), fopen(3), stdio(3), system(3)

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Jarosław Beczek <bexx@poczta.onet.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

2 maja 2024 r. Linux man-pages 6.9.1