Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/sem.h>
  6. #include <pthread.h>
  7. #include <signal.h>
  8. #include <sys/stat.h>
  9. #include <errno.h>
  10. struct sembuf buf;
  11. sigset_t maska;
  12. int pom=1;
  13. struct mymsgbuf {
  14. long mtype; /* Typ wiadomości */
  15. char i[20]; /* Zmienna przekazywana w wiadomości, w tym przypadku liczba całkowita */
  16. } msg;
  17. void sigodbierzzakoncz(int sig)
  18. {
  19. kill(getppid(),SIGRTMAX);
  20. }
  21. void sigzakoncz()//konczenie programu
  22. {
  23. puts("proces macierzysty koncze program\n.\n.\n.\n");
  24. kill(getpid()+3,SIGKILL);
  25. kill(getpid()+2,SIGKILL);
  26. kill(getpid()+1,SIGKILL);
  27. kill(getpid(),SIGKILL);
  28. }
  29. void sigodbierzstop(int sig)
  30. {
  31.  
  32. kill(getppid(),SIGRTMIN+3);
  33. }
  34. void sigprzeslijstop(int sig)
  35. {
  36. kill(getpid()+1,SIGRTMAX-3);
  37. kill(getpid()+2,SIGRTMAX-3);
  38. kill(getpid()+3,SIGRTMAX-3);
  39. }
  40. void sigstop(int sig)
  41. {
  42. printf("%d wstrzymany\n",getpid());
  43. sigfillset(&maska);
  44. sigdelset(&maska,SIGRTMIN+2);
  45. sigdelset(&maska,SIGRTMIN+1);
  46. sigdelset(&maska,SIGRTMAX-1);
  47. sigsuspend(&maska);
  48. }
  49. void sigodbierzstart()
  50. {
  51. kill(getppid(),SIGRTMAX-2);
  52. }
  53. void sigprzeslijstart()
  54. {
  55. kill(getpid()+3,SIGRTMAX-1);
  56. kill(getpid()+2,SIGRTMAX-1);
  57. kill(getpid()+1,SIGRTMAX-1);
  58. }
  59. void sigstart()
  60. {
  61.  
  62. }
  63. struct mymsgbuf buff;
  64. int open_queue( key_t keyval ) {
  65. int qid;
  66. if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
  67. return(-1);
  68. return(qid);
  69. }
  70.  
  71. int send_message( int qid, struct mymsgbuf *qbuf ){
  72. int result, length;
  73. length = sizeof(struct mymsgbuf) - sizeof(long);
  74. if((result = msgsnd( qid, qbuf, length, 0)) == -1)
  75. return(-1);
  76. return(result);
  77. }
  78.  
  79. int remove_queue( int qid ){
  80. if( msgctl( qid, IPC_RMID, 0) == -1)
  81. return(-1);
  82. return(0);
  83. }
  84.  
  85. int read_message( int qid, long type, struct mymsgbuf *qbuf ){
  86. int result, length;
  87. length = sizeof(struct mymsgbuf) - sizeof(long);
  88. if((result = msgrcv( qid, qbuf, length, type, 0)) == -1)
  89. return(-1);
  90. return(result);
  91. }
  92.  
  93.  
  94. void zwieksz(int semid,int semnum)
  95. {
  96. buf.sem_num=semnum;
  97. buf.sem_op=1;
  98. buf.sem_flg=0;
  99. if(semop(semid,&buf,1)==-1)
  100. //puts("err zwieksz");
  101. ;
  102. }
  103.  
  104. void zmniejsz(int semid,int semnum)
  105. {
  106. buf.sem_num=semnum;
  107. buf.sem_op=-1;
  108. buf.sem_flg=0;
  109. if(semop(semid,&buf,1)==-1)
  110. //puts("err zmniejsz");
  111. ;
  112. }
  113.  
  114. int typwiad=12345;
  115. //////////////////////////////////////main
  116. int main()
  117. {
  118. int fd[2]={0,0};
  119. pipe(fd);
  120. signal(SIGRTMIN+3,sigprzeslijstop);
  121. signal(SIGRTMAX-2,sigprzeslijstart);
  122. signal(SIGRTMAX,sigzakoncz);
  123. //////////////proces1
  124. if(fork()==0)
  125. {
  126. signal(SIGRTMIN,sigodbierzstop);
  127. signal(SIGRTMAX-3,sigstop);
  128. signal(SIGRTMIN+1,sigodbierzstart);
  129. signal(SIGRTMAX-1,sigstart);
  130. signal(SIGRTMIN+2,sigodbierzzakoncz);
  131. FILE *pfile;
  132. int semid;
  133. char x;
  134. semid=semget(5281,3,IPC_CREAT|0600);
  135. if(semid==-1)
  136. puts("err tworzenie tablicy semaforow!");
  137. semctl(semid,0,SETVAL,(int)1);
  138. semctl(semid,1,SETVAL,(int)0);
  139. semctl(semid,2,SETVAL,(int)0);
  140. if((pfile=fopen("dane.txt","r"))==NULL)
  141. puts("blad przy otwieraniu dane.txt");
  142. x=fgetc(pfile);
  143. close(fd[0]);
  144. while(1)
  145. {
  146. while(!feof(pfile))
  147. {signal(SIGRTMIN,sigodbierzstop);
  148. signal(SIGRTMAX-3,sigstop);
  149. signal(SIGRTMIN+1,sigodbierzstart);
  150. signal(SIGRTMAX-1,sigstart);
  151. signal(SIGRTMIN+2,sigodbierzzakoncz);
  152. zmniejsz(semid,0);
  153. //printf("proces1: %c a int %d a hex %x\n",x,(int)x,(int)x);
  154. write(fd[1],&x,sizeof(x));sleep(1);
  155. zwieksz(semid,1);
  156. x=fgetc(pfile);
  157. }
  158. sleep(1);puts("koniec pliku");
  159. }
  160. }
  161.  
  162. ////////////proces2
  163. if(fork()==0)
  164. {
  165. signal(SIGRTMIN,sigodbierzstop);
  166. signal(SIGRTMAX-3,sigstop);
  167. signal(SIGRTMIN+1,sigodbierzstart);
  168. signal(SIGRTMAX-1,sigstart);
  169. signal(SIGRTMIN+2,sigodbierzzakoncz);
  170. int semid;
  171. char y;
  172. char hex[2];
  173. semid=semget(5281,3,0600);
  174. if(semid==-1)
  175. puts("err przylaczanie tablicy semaforow k1!");
  176. close(fd[1]);
  177. int qid;
  178. key_t msgkey;
  179. /* Generowanie wartości klucza IPC */
  180. msgkey = ftok(".", 'm');
  181.  
  182. /* Otwieranie/Tworzenie kolejki komunikatow */
  183. if(( qid = open_queue( msgkey)) == -1) {
  184. puts("err tworzenie_kolejki");
  185. exit(1);
  186. }
  187. while(1)
  188. {signal(SIGRTMIN,sigodbierzstop);
  189. signal(SIGRTMAX-3,sigstop);
  190. signal(SIGRTMIN+1,sigodbierzstart);
  191. signal(SIGRTMAX-1,sigstart);
  192. signal(SIGRTMIN+2,sigodbierzzakoncz);
  193. zmniejsz(semid,1);
  194. read(fd[0],&y,sizeof(y));
  195. sprintf(&hex,"%x",y);
  196. printf("dane: %c hex: %s\n",y,hex);
  197. msg.mtype=typwiad;
  198. strcpy(msg.i,hex);
  199. send_message( qid, &msg );
  200. zwieksz(semid,2);
  201. }
  202.  
  203. }
  204. ////////////proces3
  205. if(fork()==0)
  206. {
  207. signal(SIGRTMIN,sigodbierzstop);
  208. signal(SIGRTMAX-3,sigstop);
  209. signal(SIGRTMIN+1,sigodbierzstart);
  210. signal(SIGRTMAX-1,sigstart);
  211. signal(SIGRTMIN+2,sigodbierzzakoncz);
  212. char z[20];
  213. int semid;
  214. semid=semget(5281,3,0600);
  215. if(semid==-1)
  216. puts("err przylaczanie tablicy semaforow k2!");
  217. int qid;
  218. key_t msgkey;
  219.  
  220. /* Generowanie wartości klucza IPC */
  221. msgkey = ftok(".", 'm');
  222.  
  223. /* Otwieranie/Tworzenie kolejki komunikatow */
  224. if(( qid = open_queue( msgkey)) == -1) {
  225. perror("Otwieranie_kolejki");
  226. exit(1);
  227. }
  228.  
  229. msg.mtype = typwiad;
  230. while(1)
  231. {signal(SIGRTMIN,sigodbierzstop);
  232. signal(SIGRTMAX-3,sigstop);
  233. signal(SIGRTMIN+1,sigodbierzstart);
  234. signal(SIGRTMAX-1,sigstart);
  235. signal(SIGRTMIN+2,sigodbierzzakoncz);
  236. zmniejsz(semid,2);
  237. read_message(qid, msg.mtype, &msg);
  238. strcpy(z,msg.i);
  239. if(pom%15==0 && pom!=0)
  240. fprintf(stderr,"%s \n",z);
  241. else
  242. fprintf(stderr,"%s ",z);
  243. pom=pom+1;printf("%d",pom);
  244. zwieksz(semid,0);
  245. }
  246.  
  247. }
  248. while(1){ signal(SIGRTMIN+3,sigprzeslijstop);
  249. signal(SIGRTMAX-2,sigprzeslijstart);
  250. signal(SIGRTMAX,sigzakoncz);};
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement