Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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>
- #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);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment