Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/msg.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #define MSG_SZ_MAX 255
- struct message{
- long mtype;
- pid_t pid;
- char mtext[MSG_SZ_MAX];
- };
- int descr;
- struct message sendMsg, recieveMsg;
- static void sigHandle(int signum);
- void main(){
- descr = msgget(10, IPC_CREAT|0666);
- if(descr==-1){
- perror("msgget");
- }
- printf("descriptor : %d\n", descr);
- pid_t myPID = getpid();
- printf("PID : %d\n", myPID);
- 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);
- }
- if(signal(SIGTERM, sigHandle) == SIG_ERR){
- perror("Can't handle a signal SIGTERM.");
- exit(1);
- }
- //WHERE TO SEND
- printf("Receiver's PID : ");
- pid_t receiverPID;
- scanf("%d", &receiverPID);
- //setting sending msg metainfo
- sendMsg.mtype = receiverPID;
- sendMsg.pid = myPID;
- //setting recieve msg metainfo
- recieveMsg.mtype = myPID;
- fflush(stdout);
- if(fork() == 0){
- //printf("child's pid = %d\n", getpid());
- while(1){
- //printf("pid=%d,sending...\n", getpid());
- char buf[MSG_SZ_MAX];
- scanf("%s", buf);
- sprintf(sendMsg.mtext, "[%d] : %s", myPID, buf);
- if(msgsnd(descr, &sendMsg, sizeof(struct message), 0) == -1){
- perror("msgsnd");
- exit(2);
- }
- }
- } else {
- //printf("parent's pid = %d\n", getpid());
- while(1){
- //printf("pid=%d,receiving...\n", getpid());
- if(msgrcv(descr, &recieveMsg, sizeof(struct message), myPID, IPC_NOWAIT) >= 1){
- printf("%s\n", recieveMsg.mtext);
- }
- }
- }
- }
- static void sigHandle(int signum){
- if(signum == SIGUSR1){
- printf("\nOther process has been terminated.\n");
- msgctl(descr, IPC_RMID, 0);
- exit(0);
- }
- if(signum == SIGINT){
- kill(recieveMsg.pid, SIGUSR1);
- msgctl(descr, IPC_RMID, 0);
- exit(0);
- }
- }
Add Comment
Please, Sign In to add comment