Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <mqueue.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <errno.h>
  6. #include <string.h>
  7.  
  8. int main (int argc, char* argv[]){
  9.  
  10. if(argc!=3){
  11. printf("Premalo/prevec argumentov!\n");
  12. return 1;
  13. }
  14.  
  15. mqd_t oprimek_vrsta = mq_open(argv[2], O_RDONLY | O_CREAT | O_NONBLOCK, 0666);
  16. mkfifo(argv[1], 0666);
  17.  
  18. int cev = open(argv[1], O_RDONLY | O_NONBLOCK);
  19.  
  20. while(1)
  21. {
  22. char podatki[10]; // prostor za podatke, ki jih bomo prebrali
  23. int l; // velikost dejansko prebranih podatkov, je lahko manjsa od velikosti prostora za podatke
  24. // prebrali bomo 1 znak, da lahko kasneje vidimo kako to vpliva na vec bralcev hkrati
  25.  
  26. // branje ne blokira ce je cev prazna
  27. l = read(cev, podatki, sizeof(podatki));
  28. if(l == 0) // cev je trenutno prazna, morda na cev trenutno ni povezan noben bralec
  29. {
  30. struct mq_attr lastnosti_vrste;
  31. if(mq_getattr(oprimek_vrsta, &lastnosti_vrste) == -1){
  32. perror("tezava pri branju lasnosti vrste");
  33. return -1;
  34. }
  35.  
  36. int maxmsg_len = lastnosti_vrste.mq_msgsize;
  37. int msg_len;
  38. char *msg = malloc(maxmsg_len+1);
  39.  
  40. memset(msg, 0, maxmsg_len+1);
  41.  
  42. msg_len = mq_receive(oprimek_vrsta, msg, maxmsg_len, NULL);
  43.  
  44. if(msg_len == -1){
  45. if(errno == EAGAIN){continue;}else{
  46. perror("tezava pri branju sporocila");}
  47. }else{
  48. printf(" %s \n", msg);
  49. }
  50. continue;
  51. }else
  52. if(l < 0) // prišlo je do napake
  53. {
  54. // kadar beremo s cevi brez prekinjanja izvajanja programa
  55. // in bi v obicajnem primeru prislo do prekinitve izvajanja
  56. // pride do napake branja EAGAIN ali EWOULDBLOCK
  57. if(errno == EAGAIN || errno == EWOULDBLOCK)
  58. {
  59. // ce pride to te napake nadaljujemo
  60. continue;
  61. }else
  62. {
  63. perror("tezava pri branju s cevi");
  64. break;
  65. }
  66. }else
  67. {
  68. // izpišimo prebrano besedilo
  69. write(1,podatki,l);
  70. }
  71. }
  72.  
  73.  
  74. return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement