Quipex icon

msg2

Quipex | PRO | 05/12/17 06:54:26 PM UTC | 0 ⭐ | 403 👁️ | Never ⏰ | []
C |

1.35 KB

|

None

|

0 👍

/

0 👎

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
 
int descr;
struct message n,l;
 
struct message{
    long mtype;
    pid_t pid;
    char mtext[100];
};
 
static void sigHandle(int signum);
 
void main(){
    if(signal(SIGINT, sigHandle) == SIG_ERR){
        perror("Can't handle a signal SIGINT.");
        exit(1);
    }   
    if(signal(SIGUSR1, sigHandle) == SIG_ERR){
        perror("Can't handle a signal SIGUSR1.");
        exit(1);
    }
    n.mtype=2;
    n.pid=getpid();
    l.mtype=1;
    descr = msgget(100,IPC_CREAT|0666);
    printf("descriptor : %d\n", descr);
    printf("PID : %d\n", getpid());
    if(descr==-1){
        printf("msgget");
    }
    while(1){
        strcpy(n.mtext, "[msg2] : ");
        char buf[100];
        scanf("%s", buf);
        strcat(n.mtext, buf);
        int res1=msgsnd(descr,&n,sizeof(struct message),0);
        if(res1==-1){
            printf("msgsnd");
        }
        int res2;
        do{
            res2=msgrcv(descr,&l,sizeof(struct message),1,IPC_NOWAIT);
            if(res2!=-1){
                printf("%s\n",l.mtext);
            }
        }while(res2!=-1);
    }
}
 
static void sigHandle(int signum){
    if(signum == SIGUSR1){
        printf("Other pal has quited.\n");
        exit(0);
    }
    if(signum == SIGINT){
        printf("\nSIGINT has been received, terminated.\n");
        kill(l.pid, SIGUSR1);
        msgctl(descr, IPC_RMID, 0);
        exit(0);
    }
}

Comments