[C(++)/linux] fifo uitlezen

Pagina: 1
Acties:

  • _JGC_
  • Registratie: Juli 2000
  • Laatst online: 04:42
Op school zijn we bezig een daemon gevalletje te schrijven die input via een fifo krijgt op het filesystem en aan de hand van wat daarin staat acties onderneemt. We zijn nog redelijk fris wat betreft C en C++, dus eerst maar simpel beginnen: het lezen van een fifo:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <fcntl.h>

#define BUFSIZE 1024

char buf[BUFSIZE];

int main() {
  int first_fifo;

  int n, c, d;
  c = d = 0;

  if ((first_fifo = open("/root/fifo", O_RDONLY)) < 0) {
    fprintf(stderr, "Error opening /root/fifo\n");
    exit(1);
  }

  while ( 1==1 ) {
    n = read(first_fifo, buf, BUFSIZE);
    printf("%s",buf);
  }
}


Ding loopt als een speer zo, maar klein (groot :?) probleempje:
als ik wat naar die fifo stuur, blijft ie het steeds herhalen. Als de fifo leeg is zou ie toch moeten wachten bij die read toch?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

while ( 1==1 )

waarom in hemelsnaam zo?
while(1) is ook goed maar waarom op deze manier zonder exit een daemon creeeren?

Doet iets met Cloud (MS/IBM)


  • drZymo
  • Registratie: Augustus 2000
  • Laatst online: 09-08 22:22
Ik heb geen verstand van die linux zut, maar als je een fifo leest, gooit hij dan ook automatisch het elementje weg? Want zover ik nu kan zien, lees je alleen maar en blijft de buffer hetzelfde. Dus het element wat er in stond blijft erin staan, tenzij je het zelf verwijdert.

Denk tenminste dat het daar aan kan liggen, kan ook iets heeeeeel anders zijn :P.

"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."


  • _JGC_
  • Registratie: Juli 2000
  • Laatst online: 04:42
Tja, is nog in beginstatus, dus die exit moet er nog in ;)

Wat betreft fifo legen: als ik dat ding afsluit met CTRL+C, is de FIFO leeg. Ook als ik met cat naar fifo schrijf en weer uitlees is ie leeg. Eenmaal uitgelezen is dus ook FIFO leeg.

Probleem waar ik net aan zat te denken: Als die fifo leeg is, blijft de buffer gewoon in oude staat en doet die printf niets anders dan telkens dezelfde buffer herhalen.

code:
1
2
3
if (n > 0) {
  printf("%s",buf);
}


Die in de while loop gezet, die n geeft nml een waarde van <= 0 als de fifo leeg is.

Verwijderd

_JGC_ schreef op 19 november 2002 @ 11:58:
Probleem waar ik net aan zat te denken: Als die fifo leeg is, blijft de buffer gewoon in oude staat en doet die printf niets anders dan telkens dezelfde buffer herhalen.
Idd.
Die in de while loop gezet, die n geeft nml een waarde van <= 0 als de fifo leeg is.
Gewoon:

code:
1
2
3
4
5
6
while ((n = read(..)) > 0)
{
  ..
}
if (n < 0)
  printf("Hele dikke error!!!!!1\n");


n=0 betekent nl. EOF, n<0 betekent een error (en het type error kun je met 'errno' opvragen).