File: fifo_reader.c | Size: 1,523 bytes | Download file | Back to directory listing | BWPOW's homepage
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
 
#define FIFO_FNAME "/tmp/moje.fifo"
#define MAX_BUF 1023
 
volatile int koniec=0;
 
void signal_sigpipe_handler(int signum)
{
  printf("Prisiel prikaz SIGPIPE (signum = %d), takze nieco divne sa stalo s rurou\n",signum);
}
 
void signal_end_handler(int signum)
{
  printf("Prisiel signal na ukoncenie (signum = %d)\n",signum);
  koniec=1;
}
 
int main(void)
{
  int fd,num;
  char buf[MAX_BUF+1];
 
  signal(SIGPIPE,signal_sigpipe_handler);
  signal(SIGINT,signal_end_handler);
  signal(SIGTERM,signal_end_handler);
 
  umask(0777);
  if(mkfifo(FIFO_FNAME,0666)==-1){
    if(errno!=EEXIST){
      perror("Nepodarilo sa mi vytvorit ruru");
      exit(1);
    }
  }
  fd=open(FIFO_FNAME,O_RDONLY|O_NONBLOCK);
  if(fd<0){
    perror("Nepodarilo sa mi otvorit ruru na citanie");
    exit(2);
  }
 
  while(!koniec){
    num=read(fd,buf,MAX_BUF);
    printf("read vratil hodnotu %d\n",num);
    if(num<0){
      if(errno==EAGAIN||errno==EWOULDBLOCK){
        printf("Rura nie je pripravena na citanie. Skusime neskor.\n");
        if(koniec) break;
        sleep(1);
        continue;
      }
      else{
        break;
      }
    }
    if(num>0){
      buf[num]='\0';
      printf("Precital som spravu \"%s\"\n",buf);
    }
    if(koniec) break;
    if(num==0) sleep(1);
  }
 
  printf("Pre istotu zatvarame ruru z nasej strany a koncime.\n");
  close(fd);
  return 0;
}