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