Advertisement
Guest User

sop

a guest
Feb 14th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <sys/types.h>
  5. #include <sys/ipc.h>
  6. #include <sys/msg.h>
  7. #include <sys/stat.h>
  8. #include <stdlib.h>
  9. #include <errno.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12.  
  13. typedef struct msqid_ds {
  14.                struct ipc_perm msg_perm;     /* Ownership and permissions */
  15.                time_t          msg_stime;    /* Time of last msgsnd(2) */
  16.                time_t          msg_rtime;    /* Time of last msgrcv(2) */
  17.                time_t          msg_ctime;    /* Time of last change */
  18.                unsigned long   __msg_cbytes; /* Current number of bytes in
  19.                                                 queue (nonstandard) */
  20.                msgqnum_t       msg_qnum;     /* Current number of messages
  21.                                                 in queue */
  22.                msglen_t        msg_qbytes;   /* Maximum number of bytes
  23.                                                 allowed in queue */
  24.                pid_t           msg_lspid;    /* PID of last msgsnd(2) */
  25.                pid_t           msg_lrpid;    /* PID of last msgrcv(2) */
  26.            } msqid_ds;
  27.  
  28. typedef struct synch               //mtype = 2-3, 8, 12
  29. {
  30.     long mtype;  
  31.     char synch;
  32. } synch;
  33.  
  34. typedef struct Msg1              
  35. {
  36.     long mtype;  
  37.     int id_kolejki;
  38. } Msg1;
  39.  
  40. typedef struct Msg2
  41. {
  42.     long mtype;
  43.     char synch;
  44. } Msg2;
  45.  
  46. int main(int argc, char* argv[])
  47. {
  48.     key_t wspolna_ping = 555;
  49.     size_t size_ping = 100;
  50.     int wspoldzielona_ping = shmget(wspolna_ping, size_ping, IPC_CREAT);
  51.     char *adr_wspoldzielonej_ping = shmat(wspoldzielona_ping, 0, SHM_RND);
  52.     int kol1, kol2, globalna_kolejka;
  53.     key_t klucz1 = 1234;
  54.     key_t klucz2 = 5678;
  55.     key_t globalna = 9001;
  56.     Msg1 id_kolejki_prywatnej1;
  57.     Msg1 id_kolejki_prywatnej2;
  58.     Msg2 ready1, ready2;
  59.     msqid_ds bufor;
  60.     globalna_kolejka = msgget(globalna, IPC_CREAT | 0777);
  61.     kol1 = msgget(klucz1, IPC_CREAT | 0777);
  62.     kol2 = msgget(klucz2, IPC_CREAT | 0777);
  63.     id_kolejki_prywatnej1.id_kolejki = klucz1;
  64.     id_kolejki_prywatnej2.id_kolejki = klucz2;
  65.     id_kolejki_prywatnej1.mtype = 1;
  66.     id_kolejki_prywatnej2.mtype = 1;
  67.     if(fork!=0){
  68.        while(1) {
  69.           msgctl(globalna_kolejka, IPC_RMID, 0);
  70.           usleep(250000);
  71.           globalna_kolejka=(globalna, IPC_CREAT | 0777);
  72.           msgsnd(globalna_kolejka, &id_kolejki_prywatnej1 , sizeof(int), 0);
  73.           msgsnd(globalna_kolejka, &id_kolejki_prywatnej2 , sizeof(int), 0);
  74.           msgctl(globalna_kolejka, IPC_STAT, &bufor);
  75.           while(bufor.msg_qnum==2);
  76.          
  77.        
  78.        }
  79.     }
  80.     else {
  81.        adr_wspoldzielonej_ping[1] = "f";
  82.        adr_wspoldzielonej_ping[2] = "f";
  83.        char fail;
  84.        synch ping;
  85.        ping.synch = "p";
  86.        ping.mtype = 3;
  87.        int moja_kolejka;
  88.        int a = fork();
  89.        if(a==0){
  90.            moja_kolejka = kol1;
  91.        }
  92.        else{
  93.            moja_kolejka = kol2;
  94.        }
  95.        while(1){
  96.          if(msgrcv(moja_kolejka, &ping, sizeof(char), 3, IPC_NOWAIT)<0){
  97.             usleep(150000);
  98.             if(msgrcv(moja_kolejka, &ping, sizeof(char), 3, IPC_NOWAIT)<0)
  99.                fail = "f";
  100.             else
  101.                fail = "t";
  102.          }
  103.          else fail = "t";
  104.          if(fail=="t") {
  105.              msgsnd(moja_kolejka, &ping, sizeof(char), 0);
  106.          }
  107.          if(a==0) adr_wspoldzielonej_ping[1]=fail; //adr[1] = pingowanie 1. gracza
  108.          else adr_wspoldzielonej_ping[2]=fail;
  109.          if(adr_wspoldzielonej_ping[0]=="e") break; //adr[0] = koniec gry
  110.        }
  111.        
  112.     }
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement