popen

Autres langues

Langue: pl

Autres versions - même langue

Version: 1998-05-07 (openSuse - 09/10/07)

Section: 3 (Bibliothèques de fonctions)

NAZWA

popen, pclose - we/wy procesu

SK£ADNIA

#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

OPIS

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)