Serghei Amelian scria la data de 21 Ianuarie 2006:
> On Saturday 21 January 2006 13:13, Liviu Daia wrote:
> > Serghei Amelian scria la data de 21 Ianuarie 2006:
> > > Deschid un pipe cu popen(). E posibil ca in timpul operatiilor de
> > > I/O sa dea un SIGPIPE. E nevoie sa mai inchid pipe-ul cu pclose()
> > > in cazul asta?
> >
> >     Da.
> >
> >     Background: SIGPIPE primesti cand procesul tau incearca sa scrie
> > intr-un capat al pipe-ului iar procesul de la celalt capat nu e
> > pregatit sa citeasca, fie pentru ca a murit, fie din alte motive.
> > In general trebuie sa eviti situatia asta instaland un handler
> > pentru SIGPIPE, si evitand sa scrii inainte sa te asiguri folosind
> > select(2) ca cealalta parte e pregatita.
>
> Hmm, pot sa combin select() cu popen()/fwrite()?

    Nu.  Explicatia mea a fost neclara: ce am spus mai sus se refera in
general la pipe-uri, nu la popen(3).

> Stiu ca pot sa aflu descriptorul cu fileno(), dar stiu ca nu se
> recomanda sa amesteci functiile din stdio cu cele low-level, gen
> open()/read()/write().

    Adevarat.  In cazul popen(3) nu te poti baza decat pe un signal
handler.  Daca vrei un control mai fin (situatie intalnita la aproape
toate aplicatiile nebanale), ai nevoie de toata masinaria: trebuie sa
deschizi pipe-ul cu pipe(2), sa faci fork(2) / exec(3), sa instalezi
handler-e pentru SIGCHLD etc. si sa creezi o functie low-level care
scrie in pipe caracter cu caracter, chemand de fiecare data select(2),
poll(2) sau altceva echivalent.

    Salutari,

    Liviu Daia

-- 
Dr. Liviu Daia                                  http://www.imar.ro/~daia

_______________________________________________
RLUG mailing list
RLUG@lists.lug.ro
http://lists.lug.ro/mailman/listinfo/rlug

Raspunde prin e-mail lui