#include #include #include #include #include #include #include #include #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); printf("descriptor : %d\n", descr); printf("PID : %d\n", getpid()); 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); } printf("Receiver's PID : "); pid_t pidRes; scanf("%d", &pidRes); sendMsg.mtype = pidRes; sendMsg.pid = getpid(); recieveMsg.mtype = getpid(); if(descr==-1){ perror("msgget"); } while(1){ strcpy(sendMsg.mtext, "["); //strcat(sendMsg.mtext, (char*)getpid); char senderpid[10]; snprintf(senderpid, 10, "%ld", (long)getpid()); strcat(sendMsg.mtext, senderpid); strcat(sendMsg.mtext, "] : "); /* *sendMsg.mtext += sprintf(sendMsg.mtext, "%s", "["); *sendMsg.mtext += sprintf(sendMsg.mtext, "%ld", (long)getpid()); *sendMsg.mtext += sprintf(sendMsg.mtext, "%s", "] : ");*/ char buf[MSG_SZ_MAX]; /** *INPUT */ scanf("%s", buf); strcat(sendMsg.mtext, buf); //fgets(buf, MSG_SZ_MAX, stdin); //*sendMsg.mtext += sprintf(sendMsg.mtext, "%s", buf); if(msgsnd(descr, &sendMsg, sizeof(struct message), 0) == -1){ perror("msgsnd"); exit(2); } while(1){ if(msgrcv(descr, &recieveMsg, sizeof(struct message), getpid(), IPC_NOWAIT) != -1){ printf("%s\n", recieveMsg.mtext); } else break; } } } static void sigHandle(int signum){ if(signum == SIGUSR1){ printf("\nOther process has been terminated.\n"); exit(0); } if(signum == SIGINT){ kill(recieveMsg.pid, SIGUSR1); msgctl(descr, IPC_RMID, 0); exit(0); } if(signum == SIGTERM){ printf("\nSIGTERM has been received, terminated.\n"); kill(recieveMsg.pid, SIGUSR1); msgctl(descr, IPC_RMID, 0); exit(0); } }