#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; }