Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  4 564
Har et lite pipe problem i programmet mitt, trenger hjelp til aa finne logikk feilen. Takk for all hjelp!

Beskrivelse:
Jeg har laget et program som sjekker om emails er gyldig. Jeg har skrevet en C server som mottar udp pakker med en email adresse per pakke. Selve verifiseringen skjer i et python script. Emailen som sjekkes blir gitt til python scriptet, i scriptet print('OK') om emailen er gyldig eller print('NO') om ikke gyldig. Problemet mitt er at den forste email pakken (mottatt) ikke printer ut noe, men ved alle senere pakker printes OK eller NO. Det er med andre ord noe feil i pipe logikken som forer til at forste gang fork() blir kjort saa leser ikke parent fra child. Noen som ser feil i koden? Har sittet aa sett paa dette i flere timer naa, og dermed blitt kodeblind, mulig jeg ikke helt fatter piping...

Kode

while(1) {

[some code]

switch (fork()) {
  case 0: /* child */
        dup2(mypipe[1],1);
        close(mypipe[0]);
        (void) close(sock);
        execl("/usr/bin/python2.5", "python2.5", "verify.py", email, "-u", (char *) 0);
        exit(0);
  default: /* parent */
        close(mypipe[1]);
        read(mypipe[0], buf, SIZE);
        memset(email, 0, sizeof(email));
        break;
  case -1:
        my_error(__FILE__, __LINE__, "fork error");
        exit(10);

} end while
Sist endret av Camv; 15. februar 2009 kl. 05:58.
Har du vurdert å bare bruke popen() istedet for å håndtere all forking, etc selv?

Egentlig så ville jeg heller ha modifisert python skriptet til å bare returnere en verdi som 0 ved OK og 1 ved Not-OK istedet for å skrive ting til stdout. Det ville gjort ting veldig mye enklere, siden du slipper å konsentrere deg om pipes og filehandles. Du trenger da bare å sjekke returkoden til system("./verify.py") eller noe lignende.
Sitat av Camv Vis innlegg
Har et lite pipe problem i programmet mitt, trenger hjelp til aa finne logikk feilen. Takk for all hjelp!

Beskrivelse:
Jeg har laget et program som sjekker om emails er gyldig. Jeg har skrevet en C server som mottar udp pakker med en email adresse per pakke. Selve verifiseringen skjer i et python script. Emailen som sjekkes blir gitt til python scriptet, i scriptet print('OK') om emailen er gyldig eller print('NO') om ikke gyldig. Problemet mitt er at den forste email pakken (mottatt) ikke printer ut noe, men ved alle senere pakker printes OK eller NO. Det er med andre ord noe feil i pipe logikken som forer til at forste gang fork() blir kjort saa leser ikke parent fra child. Noen som ser feil i koden? Har sittet aa sett paa dette i flere timer naa, og dermed blitt kodeblind, mulig jeg ikke helt fatter piping...

Kode

while(1) {

[some code]

switch (fork()) {
  case 0: /* child */
        dup2(mypipe[1],1);
        close(mypipe[0]);
        (void) close(sock);
        execl("/usr/bin/python2.5", "python2.5", "verify.py", email, "-u", (char *) 0);
        exit(0);
  default: /* parent */
        close(mypipe[1]);
        read(mypipe[0], buf, SIZE);
        memset(email, 0, sizeof(email));
        break;
  case -1:
        my_error(__FILE__, __LINE__, "fork error");
        exit(10);

} end while
Vis hele sitatet...


Skal vi se, jeg tror jeg ville gjort om koden til dette:

http://pastebin.ca/tree1337882

Vet ikke om det har noe å si om default står før den case -1 hos deg, men jeg mistenker det. Jeg har valgt å bruke if/else siden jeg er usikker på om fork _kun_ returnerer 0, -1 og 1. Du får si ifra hvis endringen hjalp.

PS, har ikke sjekket om syntaks er riktig
Trådstarter
tore- :
Gjorde om switch til if i steden slik som du viste i koden din, det hjalp ikke. Ingen forskjell, parent får ikke lest første childs input

rkruger
Stemmer nok det du sier ja, lettere på den måten. Men har litt lyst til å klare det med pipe, syns pipe konseptet er genialt.

Kan feilen ligge i at jeg lager pipen før while løkken?


Kode

  int mypipe[2];

  /* Create the pipe. */
  if (pipe (mypipe))
    {
      my_error(__FILE__, __LINE__, "Pipe failed.\n");
      exit(66);
      }

while(1) ....
Sist endret av Camv; 16. februar 2009 kl. 00:20. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Sitat av Camv Vis innlegg
Kan feilen ligge i at jeg lager pipen før while løkken?
Vis hele sitatet...
Ja, og det ser ikke ut som om du sjekker om dup2() systemkallet går igjennom uten problem. Du stenger jo igjen pipene etter første bruk, og lager ikke noen nye siden det blir gjort før loopen. Kan tenke meg at det er det som får programmet til å oppføre seg merkelig.