[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] C rutine til exec + pipe til og fra



On Mon, 31 May 2004 11:34:16 +0200, Hans-Christian Stadler wrote:

>> Se nedenfor (jeg håber ikke min news klient ødelægger formatteringen).
> Bravo, det ser ikke så tosset ud, selvom du har måttet ty til tricks
> (ikke lukke ubrugte fd's med det samme, indførsel af nye flags, opsplitning i funktioner)
> for at få det til at se akzeptabelt ud.

Jeg synes ikke at et ekstra flag er sværere at holde styr på end en
ekstra label. Det er bare to måder at gøre det samme på. Men se
længere nede.

Opsplitning i funktioner ser jeg slet ikke som et trick, men som et mål i
sig selv når der er så meget kode. Men da goto ikke virker på tværs af
funktioner, må de jo afskaffes.

> Jeg tør da også vedde min salige
> farmors backenbart på, at du savnede fornemmelsen af "straightforwardness"
> under kodningen.

Jeg ved ikke hvordan fornemmelsen havde været hvis jeg havde skrevet
koden fra scratch. Jeg lavede bare en omstrukturering af din kode, så de
fleste problemer gik på at gennemskue flowet gennem den. Det er jo altid
svært at læse andres kode når det er lidt komplekst.

>> Jeg er ikke generelt goto-modstander, men en så lang funktion bør under
>> alle omstændigheder deles op i flere funktioner for læsbarhedens skyld.
> Jeg er ikke goto-tilhænger - bevares. Dog prioriterer jeg læselighed højere,
> og jeg synes stadigvæk, versionen med goto er mere læseligt, netop fordi
> den er straightforward. Og så synes jeg ikke, en lang funktion per se er
> ulæseligt så længe den har et fint flow fra top til bund.

Dér bliver vi nok ikke enige. I mine øjne har det idéelle program en
main-rutine på 40-80 linjer som ligner prototype-pseudokode på den måde
at den beskriver det overordnede flow uden at gå i detaljer med
datastrukturer og implementation.

Ikke fordi run_command() skal se sådan ud, men jeg synes at læsbarhed
opnås ved at man kan forstå programmet i små bidder af gangen.

> execl lukker ikke dine fd's, din child process bærer rundt på mugne
> fd's uden at vide det.

Ups, det har du ret i.

>>, og i parent processen lukker
>> jeg pipes'ne så sent som muligt incl. de ubrugte ender.
> Det er en bommert, du skal lukke stdin af child processen, ellers
> risikerer du at hænge, fordi child venter på input, og parent på
> output fra child.

Ups, ja. Jeg var også lige på nippet til at lave en close_pipes funktion
i stil med den du har længere nede, det tror jeg vil løse problemet
samtidig med at man slipper for dine flag_* variable og mine opened_*
variable:

static void close_pipes (int pipe_fd[2])
{
  if (pipe_fd[0] >= 0) {
    pipe_fd[0] = -1;
    while(close(pipe_fd[0]) && errno = EINTR);
    while(close(pipe_fd[1]) && errno = EINTR);
  }
}

Den funktion kan man så kalde lige så tit man vil, og pipes'ne vil kun
blive lukket én gang.

> Ok, din version er da fint nok, men for at sammenligne bør man så lige
> have alternativversionen med tricks. Versgod.

Den er også god, jeg undrer mig dog over at du ikke lukker de
overflødige fd'er i child processen. Og så vidt jeg kan se bliver flag_*
sat til 1 hvis pipe() fejler, det skulle vel være lige modsat.


Mvh. Jonas



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 22:43 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *