Quipex

msgqueue_forked

May 28th, 2017
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <sys/types.h>
  2. #include <sys/msg.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <signal.h>
  7. #define MSG_SZ_MAX 255
  8.  
  9. struct message{
  10.     long mtype;
  11.     pid_t pid;
  12.     char mtext[MSG_SZ_MAX];
  13. };
  14.  
  15. int descr;
  16. struct message sendMsg, recieveMsg;
  17.  
  18. static void sigHandle(int signum);
  19.  
  20.  
  21. void main(){
  22.     descr = msgget(10, IPC_CREAT|0666);
  23.     if(descr==-1){
  24.         perror("msgget");
  25.     }
  26.    
  27.     printf("descriptor : %d\n", descr);
  28.     pid_t myPID = getpid();
  29.     printf("PID : %d\n", myPID);
  30.  
  31.     if(signal(SIGINT, sigHandle) == SIG_ERR){
  32.         perror("Can't handle a signal SIGINT.");
  33.         exit(1);
  34.     }
  35.     if(signal(SIGUSR1, sigHandle) == SIG_ERR){
  36.         perror("Can't handle a signal SIGUSR1.");
  37.         exit(1);
  38.     }
  39.     if(signal(SIGTERM, sigHandle) == SIG_ERR){
  40.         perror("Can't handle a signal SIGTERM.");
  41.         exit(1);
  42.     }
  43.    
  44.     //WHERE TO SEND
  45.     printf("Receiver's PID : ");
  46.     pid_t receiverPID;
  47.     scanf("%d", &receiverPID);
  48.  
  49.     //setting sending msg metainfo
  50.     sendMsg.mtype = receiverPID;
  51.     sendMsg.pid = myPID;
  52.  
  53.     //setting recieve msg metainfo
  54.     recieveMsg.mtype = myPID;
  55.    
  56.    
  57.     fflush(stdout);
  58.     if(fork() == 0){
  59.         //printf("child's pid = %d\n", getpid());
  60.         while(1){
  61.             //printf("pid=%d,sending...\n", getpid());
  62.  
  63.             char buf[MSG_SZ_MAX];
  64.             scanf("%s", buf);
  65.             sprintf(sendMsg.mtext, "[%d] : %s", myPID, buf);
  66.      
  67.             if(msgsnd(descr, &sendMsg, sizeof(struct message), 0) == -1){
  68.                 perror("msgsnd");
  69.                 exit(2);
  70.             }
  71.         }
  72.     } else {
  73.         //printf("parent's pid = %d\n", getpid());
  74.         while(1){
  75.             //printf("pid=%d,receiving...\n", getpid());
  76.  
  77.             if(msgrcv(descr, &recieveMsg, sizeof(struct message), myPID, IPC_NOWAIT) >= 1){
  78.                 printf("%s\n", recieveMsg.mtext);
  79.             }
  80.         }
  81.     }
  82. }
  83.  
  84. static void sigHandle(int signum){
  85.     if(signum == SIGUSR1){
  86.         printf("\nOther process has been terminated.\n");
  87.         msgctl(descr, IPC_RMID, 0);
  88.         exit(0);
  89.     }
  90.     if(signum == SIGINT){
  91.         kill(recieveMsg.pid, SIGUSR1);
  92.         msgctl(descr, IPC_RMID, 0);
  93.         exit(0);
  94.     }
  95. }
Add Comment
Please, Sign In to add comment