Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <mqueue.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <string.h>
- int main (int argc, char* argv[]){
- if(argc!=3){
- printf("Premalo/prevec argumentov!\n");
- return 1;
- }
- mqd_t oprimek_vrsta = mq_open(argv[2], O_RDONLY | O_CREAT | O_NONBLOCK, 0666);
- mkfifo(argv[1], 0666);
- int cev = open(argv[1], O_RDONLY | O_NONBLOCK);
- while(1)
- {
- char podatki[10]; // prostor za podatke, ki jih bomo prebrali
- int l; // velikost dejansko prebranih podatkov, je lahko manjsa od velikosti prostora za podatke
- // prebrali bomo 1 znak, da lahko kasneje vidimo kako to vpliva na vec bralcev hkrati
- // branje ne blokira ce je cev prazna
- l = read(cev, podatki, sizeof(podatki));
- if(l == 0) // cev je trenutno prazna, morda na cev trenutno ni povezan noben bralec
- {
- struct mq_attr lastnosti_vrste;
- if(mq_getattr(oprimek_vrsta, &lastnosti_vrste) == -1){
- perror("tezava pri branju lasnosti vrste");
- return -1;
- }
- int maxmsg_len = lastnosti_vrste.mq_msgsize;
- int msg_len;
- char *msg = malloc(maxmsg_len+1);
- memset(msg, 0, maxmsg_len+1);
- msg_len = mq_receive(oprimek_vrsta, msg, maxmsg_len, NULL);
- if(msg_len == -1){
- if(errno == EAGAIN){continue;}else{
- perror("tezava pri branju sporocila");}
- }else{
- printf(" %s \n", msg);
- }
- continue;
- }else
- if(l < 0) // prišlo je do napake
- {
- // kadar beremo s cevi brez prekinjanja izvajanja programa
- // in bi v obicajnem primeru prislo do prekinitve izvajanja
- // pride do napake branja EAGAIN ali EWOULDBLOCK
- if(errno == EAGAIN || errno == EWOULDBLOCK)
- {
- // ce pride to te napake nadaljujemo
- continue;
- }else
- {
- perror("tezava pri branju s cevi");
- break;
- }
- }else
- {
- // izpišimo prebrano besedilo
- write(1,podatki,l);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement