To se zgodi zaradi tega, ker "cat" prebere vsebino PIPE-a samo enkrat in
nato konca, s tem
pa zapre PIPE.
"select" reagira na taksno stanje tako, kot bi bil PIPE vedno pripravljen na
komunikacijo, kar pa seveda ni res, zato "read" vrne vrednost 0.
To pomeni, da je v primeru, ko "read" vrne vrednost 0, prislo do napake na
PIPE komunikaciji oziroma kateremkoli IPC nacinu, ki uporablja "read" in
"write".

NLP

Tomaz

-----Original Message-----
From: Rok Papez <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED] <[EMAIL PROTECTED]>
Date: 6. oktober 1999 21:03
Subject: [ LUGOS-PROG ] select trouble :-(


>Hi!
>
>Za IPC sem izbral FIFO named pipe.
>In sicer "mkfifo /tmp/test --mode=0777"
>v enem oknu pozenem "cat bljuz > /etc/test"
>v drugem pa dodani programcek:
>
>-----------------------------------------
>#include <stdio.h>
>#include <sys/types.h>
>#include <sys/stat.h>
>#include <sys/time.h>
>#include <fcntl.h>
>#include <unistd.h>
>
>int main(){
>  int fd,i;
>  char ch[1];
>  fd_set sel_set;
>
>  umask(0);
>  fd=open("/tmp/test",O_RDONLY | O_NONBLOCK);
>  if (-1==fd) {
>    printf("\niiiiiiiiiikkkkkkkkk\n");
>    return(2);
>  }
>
>  FD_ZERO(&sel_set);
>  FD_SET(fd,&sel_set);
>
>  printf("\nBu1!\n");
>
>  while (-1!=select(fd+1,&sel_set,NULL,NULL,NULL)) {
>    if (FD_ISSET(fd,&sel_set)) {
>      printf("fd is set!\n");
>      i=read(fd,ch,1);
>      printf("%c",ch[0],i);
>    } else {
>      printf("\nI was woken up but there is no data!\n");
>      return(1);
>    }
>    FD_ZERO(&sel_set);
>    FD_SET(fd,&sel_set);
>  }
>
>  printf("\nselect()\n");
>  return(0);
>}
>-----------------------------------------
>
>zadeva se zacilkla :(.
>select() sprva caka brez problema nato pa se aktivira vsakic, ceprav ni vec
>podatkov (read vrne 0 in kot podatek EOF). Wtf?
>
>
>--
>best regards,
>Rok Papez.
>

Reply via email to