Cteni z FIFO & vice procesu & fce select()

Tomas Rollbach troll na logix.cz
Středa Leden 3 20:23:12 CET 2001


Dobry vecer,
uz delsi dobu se trapim s programem, ktery ma bezet ve vice instancich,
pricemz kazda bude mit otevrenu rouru, do ktere jiny proces bude neco
zapisovat. Chtel bych, aby kazdy proces pokazde precetl 1 znak, nejak ho
zpracoval a cekal az se v roure objevi dalsi.

Takze udelal jsem programek:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>

int main()
{
   int      fd, pid, cnt, retval, i;
   fd_set   rfds;
   char     c;

   fd=open("tst.fifo", O_NONBLOCK|O_RDONLY);
   if(fd<0) { printf("%s\n", strerror(errno)); return -1; }

   pid=getpid();
   printf("PID: %d\n", pid);

   for(i=0; i<10; i++)
   {
      FD_ZERO(&rfds);
      FD_SET(fd, &rfds);
      retval = select(fd+1, &rfds, NULL, NULL, NULL);
      if(retval)
      {
         cnt=read(fd, &c, 1);
         if(cnt==0) printf("%d: no char\n", pid);
         if(cnt<0) printf("%d: %s\n", pid, strerror(errno));
         if(cnt>0) printf("%d: %c\n", pid, c);
      }
   }
   return 0;
}

ktery zkompiluju a spustim ve trech kopiich, cimz dostanu vystup, napr:
PID: 1549
PID: 1553
PID: 1551

Ted do roury neco zapisu:

$ echo "Baf babo" > tst.fifo

Coz provede nasledujici:

1549: B
1553: a
1551: f
1551:
1553: b
1549: a
1549: b
1553: o
1551:

1551: no char
1553: no char
1549: no char
1553: no char
[...]
1551: no char
1553: no char
1549: no char

nacez vsechny procesy jaksepatri skonci.

Nechapu proc select pusti vykonavani programu, kdyz uz neni co cist! :-(((

Vim, ze by to slo udelat blokujicim read(), jenze ja v tom selectu() [az
mi to bude chodit :-/ ] budu cekat jeste na dalsi descriptory, takze tohle
pouzit nemuzu.

Muzete mi nekdo poradit, co tam je blbe a jak to ma byt spravne?

Diky za kazdy napad.

- troll




Další informace o konferenci Linux